linux终端命令里的美元符号$究竟有啥玄机
程序员经常要在终端(Terminal)执行指令,其中经常出现的一个字符就是美元符号(dollar sign):$。相信很多人会感觉困惑,这玩意到底是啥?不要急,本文将为你揭开谜底。
shell prompt末尾的$
每次打开一个终端,首先印入眼帘的是大概这样的一行代码:
Last login: Tue Jun 7 18:38:30 on ttys000
MacBookPro:~ chenxin$
先解释一下以上代码的含义,第一行没特别之处,略过。第二行中MacbookPro是主机名,不同的人主机名不一样,对应的显示也不一样。表示当前操作路径是当前登陆用户的根目录。chenxin表示当前操作计算机的登陆用户名。关键是结尾的美元符号"$",它出现在这个位置表示终端等待用户输入命令。"MacBookPro: chenxin$"这样以主机名开始,以"$"结束的一行叫做shell prompt,对应的shell版本是 Bourne shell (比如 POSIX shell, Korn shell或者 Bash)。如果shell prompt以%结束(比如"MacBookPro:~ chenxin%"),对应的shell版本是C shell(csh或者tcsh)。如果shell prompt以#结束(比如"MacBookPro:~ chenxin#"),表示正在以超级用户(mac下输入sudo su进入超级用户)身份运行当前的shell。另外,在网上看别人的技术文章,经常看到类似于这样的代码片段:
$nvm install v5.11.0
$nvm use v5.11.0
$nvm alias default v5.11.0
每行代码均以"$"开始,所以,以"$"开头贴出代码片段是暗示读者该代码是在终端中执行的,而"$"之前的shell prompt部分通常省略掉(主要是主机名和用户名,贴出来没任何意义)。
命令中的$
出现在命令中的"$"表示“扩展(expand)”,也有其它说法比如dereferencing(姑且翻译为逆引用吧),有点类似于C语言中对一个指针取地址的运算符"*"。比如笔者主机的环境变量HOME对应的路径是/Users/chenxin,当笔者键入以下命令:
$echo $HOME
或者
$echo ${HOME}
输出的结果都是
/Users/chenxin
可以看到,"$"相当于取出了HOME所指代的真实路径,就像"*"取出了指针所指向的真实地址。我们可以给HOME赋任意的值,所以
$echo $HOME
理论上可以打印输出任意的值假如没有这个运算符,也就没有必要让HOME指代/Users/chenxin这个路径了,因为我们根本没有能够解析HOME真实值的方法,是"$"让HOME有了生命力,,我想这就是"$"有"expand"含义的由来。
"$"后紧跟变量variable可以这么写
$echo $variable
或者
$echo ${variable}
如果是一个命令(command)呢?这么写
$echo $(command)
显然"$"可以把命令(command)的执行结果取出来。