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

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

我很困惑,试图将一些文件从一台电脑复制到另一台电脑。我已经搞清楚了,但语法对我来说仍然很混乱。这有效:

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

~DesktopDesktop如果存在这样的用户(通常不存在),则会扩展到用户的主目录,或者仅仅是~Desktop(通常也不存在的路径)。


在:

scp ~/Desktop/Volenteer.png     [email protected]:~/j0h/b

~/j0h将扩展到主目录j0h中名为的目录,但该目录不太可能存在。jay


差异并不在于~和,而在于和。~/~~foo


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

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

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

如果你使用pushdpopd维护目录堆栈,并且将是~N~+NNdirs目录堆栈中的第 目录,如.的输出所示,将是~-NN从末尾开始的第 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/userbash因此在 的情况下~/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

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

相关内容