我很困惑,试图将一些文件从一台电脑复制到另一台电脑。我已经搞清楚了,但语法对我来说仍然很混乱。这有效:
scp ~/Desktop/Volenteer.png [email protected]:~j0h/b
将其放入Volenteer.png
文件夹/home/j0h/b
。但是,这不起作用:
scp ~Desktop/Volenteer.png [email protected]:~j0h/b
这也会失败,给出退出状态 1 文件未找到:
scp ~/Desktop/Volenteer.png [email protected]:~/j0h/b
就像这样:
scp ~Desktop/Volenteer.png [email protected]:~j0h/b
显然,~
和之间存在一些差异~/
,这种差异在于/
$~/
bash: /home/j0h/: Is a directory
$ ~
bash: /home/j0h: Is a directory
那么为什么在 scp 中,解析~
为~/
?这只是猜测,我无法验证是否发生了这种情况。但它似乎不一致,因此令人困惑。这是 scp 中的错误吗?还是我遗漏了有关波浪号的某些内容?
答案1
~
是你的主目录。
~foo
如果用户 存在,则为该用户的主目录;如果用户 不存在foo
,则仅为名为 的目录。~foo
因此,在:
scp ~Desktop/Volenteer.png [email protected]:~j0h/b
~Desktop
Desktop
如果存在这样的用户(通常不存在),则会扩展到用户的主目录,或者仅仅是~Desktop
(通常也不存在的路径)。
在:
scp ~/Desktop/Volenteer.png [email protected]:~/j0h/b
~/j0h
将扩展到主目录j0h
中名为的目录,但该目录不太可能存在。jay
差异并不在于~
和,而在于和。~/
~
~foo
此外,~
还可以用于目录历史导航:
~-
是先前的工作目录(如$OLDPWD
)~+
是当前工作目录(如$PWD
)
这不适用于scp
,因为您无法在scp
操作过程中更改目录。
如果你使用pushd
和popd
维护目录堆栈,并且将是~N
~+N
N
dirs
目录堆栈中的第 目录,如.的输出所示,将是~-N
N
从末尾开始的第 1 个目录(两种情况下都从零开始计数)。例如:
$ 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
~+ ~-
答案2
阅读Bash Tilde 扩展的 GNU 文档(正如我在第一次重复这个答案之前应该做的那样)。
~/Desktop
并且~j0h
做的事情根本不同,这就解释了为什么~Desktop
不起作用:
普通字符
~
将替换您$HOME
登录时设置的当前环境变量。因此,对我~
来说解析为/home/oli
,并~/Desktop
读取为/home/oli/Desktop
。这是您看到波浪号使用最多的地方。~username
解析到的家该用户,如中设置的那样/etc/passwd
。因此~oli
解析为/home/oli
,~j0h
可能解析为/home/j0h
但不一定,您的主目录可以位于任何地方。~not-a-username
无法解析。因为Desktop
不是用户,~Desktop
所以无法替换。它按字面意思理解为文件或路径名称~Desktop
(此处不存在)。
不用说,这一切都是在远程发生的(scp
如果用本地值替换它,它将毫无用处)。这是有效的,因为~...
如果它前面有空格以外的任何内容,Bash 就不会替换它。
答案3
该符号~
是 的简写/home/user
,bash
因此在 的情况下~/Desktop/Volenteer.png
它是 的简写/home/user/Desktop/Volenteer.png
。
正如您所看到的/
,与往常一样,显示了文件系统层次结构中的一个新级别。
答案4
~
是大多数 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
要在 POSIX 系统(UNIX、Linux、OS X、BSD)上查找使用密码(5)像这样在数据库上运行 awk /etc/passwd
:
awk -F: '{ print $1,$(NF-1) }' /etc/passwd
这将列出每个本地用户及其主目录。