如何使用代字号作为我的主目录的快捷方式?
我很困惑,试图将一些文件从一台PC复制到另一台PC。 我弄清楚了,但语法仍然让我感到困惑。 这有效:
scp ~/Desktop/Volenteer.png jay@server.ip:~j0h/b
它将Volenteer.png
放在文件夹/home/j0h/b
。 但是,这不起作用:
scp ~Desktop/Volenteer.png jay@server.ip:~j0h/b
这也失败了,没有找到退出状态1文件:
scp ~/Desktop/Volenteer.png jay@server.ip:~/j0h/b
就像这样:
scp ~Desktop/Volenteer.png jay@server.ip:~j0h/b
很明显, ~
和~/
之间存在一些差异。差异在于~/
的存在
$~/ bash: /home/j0h/: Is a directory $ ~ bash: /home/j0h: Is a directory
那么为什么在scp中, ~
解决~/
? 这是一个猜测,我无法证实这是发生了什么。 但它似乎不一致,因此令人困惑。 这是scp中的错误吗? 还是有什么关于代字号我错过了?
~
是你的主目录。
~foo
是用户foo
的主目录,如果存在这样的用户,或者只是名为~foo
的目录,如果该用户不存在的话。
因此,在:
scp ~Desktop/Volenteer.png jay@server.ip:~j0h/b
~Desktop
将扩展到用户Desktop
主目录,如果这样的用户存在(并且它通常不存在),或者只是~Desktop
(通常也不存在的路径)。
在:
scp ~/Desktop/Volenteer.png jay@server.ip:~/j0h/b
~/j0h
将扩展到jay
主目录中名为j0h
的目录,这个目录也不太可能存在。
这不是~
和~/
差异发生的地方,而是~
和~foo
。
此外, ~
还可用于目录历史导航:
-
~-
是以前的工作目录(比如$OLDPWD
) -
~+
是当前的工作目录(比如$PWD
)
这不适用于scp
,因为您无法在scp
操作过程中更改目录。
如果使用pushd
和popd
来维护目录堆栈, ~ N
和~+ N
将是目录堆栈中的第N
个目录,如dirs
的输出中所示。 ~- N
将是结尾的第N
个目录(在两种情况下从零开始计算)。 例如:
$ for i in etc usr var tmp; do pushd /$i; done /etc ~/.vim /usr /etc ~/.vim /var /usr /etc ~/.vim /tmp /var /usr /etc ~/.vim $ dirs /tmp /var /usr /etc ~/.vim
然后,可以使用以下方法访问堆栈中的目录:
/tmp /var /usr /etc ~/.vim ~0 ~1 ~2 ~3 ~4 ~+0 ~+1 ~+2 ~+3 ~+4 ~-4 ~-3 ~-2 ~-1 ~-0 ~+ ~-
阅读Bash Tilde Expansion的GNU文档 (正如我在第一次回答此问题之前所应有的那样)。
~/Desktop
和~j0h
正在做着根本不同的事情,这就解释了为什么~Desktop
不起作用:
-
plain
~
替换当前的$HOME
环境变量,在登录时设置。 所以~
为我解析为/home/oli
,~/Desktop
读作/home/oli/Desktop
。 这是你看到最常用的tilda的地方。 -
~username
解析为该用户的home,如/etc/passwd
所设置。 所以~oli
~j0h
解析为/home/j0h
,~j0h
可能会解析为/home/j0h
但不是必须的,你的homedir可以在任何地方。 -
~not-a-username
无法解析。 由于Desktop
不是用户,因此不会替换~Desktop
。 它实际上是一个名为~Desktop
的文件或路径(这里不存在)。
不用说,这一切都是远程发生的(如果它被本地值替换,它在scp
中将毫无用处)。 这是有效的,因为Bash不会替换~...
如果它之前只有空格。
符号~
用作bash
/home/user
的快捷方式,因此在~/Desktop/Volenteer.png
的情况下,它是/home/user/Desktop/Volenteer.png
简写。
因此,您可以看到/
,一如既往地在文件系统层次结构中显示新级别。
~
是大多数c shell派生/支持POSIX兼容shell的环境变量$HOME
简写。 ~
的最常见用途是在引用您自己的主目录或其他用户的主目录时:
cd ~ # ie shell, take me to my home folder cd ~root # ie shell, take me to root's home folder
要在使用passwd(5)数据库的POSIX系统(UNIX,Linux,OS X,BSD)上查找任何本地用户的主目录,请在/etc/passwd
上运行awk,如下所示:
awk -F: '{ print $1,$(NF-1) }' /etc/passwd
这将列出每个本地用户及其主目录。