使用波浪号如何将其用作主目录的快捷方式?


30

我很困惑,试图将某些文件从一台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中的错误吗?还是我想念的代字号?


2
在这里只是一个旁注,它的拼写为“ volunteer”,用“ u”代替“ e” :)
AER

2
我是一个自由主义者。
2015年

Answers:


68

~ 是您的主目录。

~foo是user的主目录(foo如果存在),或者是名为的目录~foo(如果该用户不存在)。


因此,在:

scp ~Desktop/Volenteer.png     jay@server.ip:~j0h/b

~Desktop将会扩展到user的主目录Desktop,如果该用户存在(通常不存在)或仅仅是~Desktop(通常也不存在的路径)。


在:

scp ~/Desktop/Volenteer.png     jay@server.ip:~/j0h/b

~/j0h将扩大到一个指定的目录j0hjay的主目录,这又是不可能存在的。


不是~~/发生差异的地方,而是在~和中~foo


此外,~还可以用于目录历史记录导航:

  • ~-是上一个工作目录(如$OLDPWD
  • ~+是当前的工作目录(如$PWD

这不适用于scp,因为您不能在scp操作过程中更改目录。

如果你使用pushdpopd维护一个目录栈,并且将是在目录栈次目录,在输出看到。将是~N~+NNdirs~-NN末尾第一个目录(在两种情况下都从零开始计数)。例如:

$ 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 
  ~+   ~-

所以,~+总是等于.那时,对吗?似乎多余。
通配符

1
@Wildcard好吧,不完全是。~+~-使用的值$PWD$OLDPWD,这是绝对路径。.始终是相对路径。因此,如果执行时有一条更改当前工作目录的命令,它将看到的新路径.,其中扩展的路径~-将保持不变。tar -C就是一个例子,尽管我承认我对没什么好用~+$PWD一样好,只是~+/foo/bar如果$PWD包含空格则不需要引用。
muru

1
谢谢,这澄清了这一点。实际上,这是一个很好的示例用例:出于安全原因,某些命令拒绝在相对路径上操作;使用这样的命令你不能使用./filename但可以"$PWD/filename"或更简单地使用~+/filename。(和一些命令将工作于相对路径,但有一个功能上的差异,例如lntar。)
通配符

21

阅读有关Bash Tilde扩展GNU文档(在此答案的第一次迭代之前,我应该已经)。

~/Desktop并且~j0h正在做根本不同的事情,这解释了为什么~Desktop不起作用:

  • 用平原~代替您$HOME在登录时设置的当前环境变量。因此~/home/oli为我下定决心,并~/Desktop读为/home/oli/Desktop。在这里您可以看到tilda最常用。

  • ~username解析为该用户的家,如中所述/etc/passwd。因此,~oli解析为/home/oli~j0h可能会解析为(/home/j0h但不一定)您的homedir可以在任何地方。

  • ~not-a-username无法解决。因为Desktop不是用户,~Desktop所以不能替代。从字面上看,它被视为一个名为的文件或路径~Desktop(此处不存在)。

不用说,这都是远程发生的(scp如果将其替换为本地值,那将毫无用处)。之所以可行,是因为~...如果Bash 前面没有空格,它将无法替代。


什么getent passwd bin发言权?
muru 2015年

2
“ bin”是大多数Linux机器上的系统用户,主目录为/ bin。
fNek

1
扩展失败~dir与GNU文档一致:“ ...波浪号后面的波浪号前缀中的字符被视为可能的登录名 ...如果登录名无效,或者波浪号扩展失败,则单词保持不变。” 这里,dir不是该系统上的用户名,因此保持不变。
apsillers'Aug

谢谢大家 我可能应该阅读我发布的链接:)
奥利(Oli)

4

该符号~用作/home/userin 的快捷方式bash,因此~/Desktop/Volenteer.png它是。的简写/home/user/Desktop/Volenteer.png

如您所见/,和一样,它在文件系统层次结构中显示了一个新的级别。


3
仅右半数,它是$ HOME环境变量的简写。~{user}/可以是passwd(5)数据库文件设置的任何随机路径。是的,filesytem.org标准确实将普通用户放置在/ home中,而并非每个用户都这样(即,root在/ root中,服务在/ var / ...或更旧的unixies中使用/ usr而不是/ home)
德怀特·斯潘塞

DwightSpencer是正确的。我维护着几个服务器,这些用户位于/ usr / {CLIENTNAME} / home /中,并在多个内部和远程系统(都指向该目录)上共享,因此仅需要维护一个系统。〜指向该目录;)
Rinzwind 2015年

3
@Rinzwind eek。我必须为这种滥用圣礼而抗议/usr
muru

@muru嘿,这不是我的电话>:-D这是SCO D遗留下来的:
Rinzwind

1
老实说,我喜欢对用户使用/ usr的所有东西,因为那是最初的含义。这些天来,我发现/ usr / bin被更随意地滥用,成为基本binutils之外所有二进制文件(sys,user,sysop)的统一统一转储场。毕竟,/ usr是指用户可以从nfs挂载访问的所有内容,而/ usr / local是本地用户空间,其中/ sbin是sysop二进制文件,而/ bin是系统bin。我知道/ home可以是一个不同的分区,但是/ usr / home / ...可以将其保留在/ usr中,可以在策略,实现和思维方式上将其保留为用户名称空间。
德怀特·斯潘塞

3

~$HOME大多数c shell派生/支持POSIX兼容shell上环境变量的简写。最常见的用途~是在引用自己的主目录或其他用户的主目录时:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.