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
,因此环境变量中尽量用完整的绝对路径
!