爱学习的好孩子

Linux中~(tilde)和$HOME的区别

时间: 2024-06-14

我一直认为~$HOME等效的,直到我用ssh登陆fedora后,运行deno程序时出现了错误。我的.bash_profile是这么写的:

export DENO_INSTALL="~/.deno"
export PATH=$PATH:$DENO_INSTALL/bin:/usr/local/nodejs/bin/

我可以运行deno,但是当我运行用deno install的脚本时,提示错误:

/home/adong/.deno/bin/testCMD: 第 3 行:exec: deno: 未找到

明明可以运行deno,说明deno的路径已经在path中了,但是运行脚本就会出错。

如果我将.bash_profile修改为:

export DENO_INSTALL="/home/adong/.deno"
export PATH=$PATH:$DENO_INSTALL/bin:/usr/local/nodejs/bin/

一切运行正常,Good.

~$HOME的完整路径,到底有什么区别?

我查阅了GNU - Tilde Expansion 中介绍~和由它构成的tilde-prefixshell中是如何被处理的,用代码举例解释:

  1. 没有引号或者任何字符~之前的时候,才构成所谓tilde-prefix
# "~"前有引号
$ echo "~"
~ 

# "~"前有其他字符串
$ echo test~
test~ 
  1. 这个tilde-prefix中没有任何字符被引号包围的时候,~后的字符被当作可能的登录名
# 由于后面"test"被引号包围,所以"~"被当作字符串处理
$ echo ~"test"
~test
  1. 如果登录名是空字符串~被替换为shell变量$HOME
$ echo ~
/home/xiaofei
$ echo ~/foo
/home/xiaofei/foo
  1. 否则tilde-prefix被替换为特定登录名的$HOME
# ~root被当作用户root的home目录
$ echo ~root/foo
/root/foo 

# ~xiaofei被当作用户xiaofei的home目录
$ echo ~xiaofei/foo
/home/xiaofei/foo 

# 由于"test"用户名不存在,因此"~"被当作字符串处理
$ echo ~test
~test 
  1. 其他一些用法
# 当前目录
$ pwd
/home/xiaofei/test

# "~+"被替换为当前目录
$ echo ~+/foo
/home/xiaofei/test/foo

# "~-"被替换为上一次所在目录
$ echo ~-/foo
/home/xiaofei/foo 

虽然该文档中也提到,在指定$PATH等环境变量时用~是OK的,但是从上述问题来看,~在读入另一个程序中进行处理的时候,可能出现意想不到的Bug,因此环境变量中尽量用完整的绝对路径

评论