如何使用代字号作为我的主目录的快捷方式?

我很困惑,试图将一些文件从一台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操作过程中更改目录。

如果使用pushdpopd来维护目录堆栈, ~ 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 

这将列出每个本地用户及其主目录。