问题描述
我很困惑,试图将一些文件从一台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
~+ ~-
次佳解决办法
仔细阅读GNU documentation for Bash Tilde Expansion(正如我在第一次回答这个答案之前所做的那样)。
~/Desktop
和~j0h
正在做着根本不同的事情,这解释了为什么~Desktop
不起作用:
-
简单的
~
替代您当前的$HOME
环境变量,在登录时设置。因此,~
为我解析为/home/oli
,而~/Desktop
读作/home/oli/Desktop
。这是你看到最常用的tilda的地方。 -
~username解析为该用户的home,如/etc /passwd中所设置。所以~oli解析为/home /oli,~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 # i.e. 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
这将列出每个本地用户及其主目录。