当前位置: 首页>>技术问答>>正文


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

, , ,

问题描述

我很困惑,试图将一些文件从一台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 
  ~+   ~-

次佳解决办法

仔细阅读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

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/6433.html,未经允许,请勿转载。