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-prefix在shell中是如何被处理的,用代码举例解释:
- 没有
引号或者任何字符在~之前的时候,才构成所谓tilde-prefix。 
# "~"前有引号
$ echo "~"
~ 
# "~"前有其他字符串
$ echo test~
test~ 
- 这个
tilde-prefix中没有任何字符被引号包围的时候,~后的字符被当作可能的登录名 
# 由于后面"test"被引号包围,所以"~"被当作字符串处理
$ echo ~"test"
~test
- 如果登录名是
空字符串,~被替换为shell变量$HOME 
$ echo ~
/home/xiaofei
$ echo ~/foo
/home/xiaofei/foo
- 否则
tilde-prefix被替换为特定登录名的$HOME 
# ~root被当作用户root的home目录
$ echo ~root/foo
/root/foo 
# ~xiaofei被当作用户xiaofei的home目录
$ echo ~xiaofei/foo
/home/xiaofei/foo 
# 由于"test"用户名不存在,因此"~"被当作字符串处理
$ echo ~test
~test 
- 其他一些用法
 
# 当前目录
$ pwd
/home/xiaofei/test
# "~+"被替换为当前目录
$ echo ~+/foo
/home/xiaofei/test/foo
# "~-"被替换为上一次所在目录
$ echo ~-/foo
/home/xiaofei/foo 
虽然该文档中也提到,在指定$PATH等环境变量时用~是OK的,但是从上述问题来看,~在读入另一个程序中进行处理的时候,可能出现意想不到的Bug,因此环境变量中尽量用完整的绝对路径!