执行该命令后会发生什么情况?
PATH =$PATH:`pwd`
错误:当我在终端执行命令时什么也没有发生。
答案1
如果您执行问题中的命令,您应该会收到一条错误消息:
$ PATH =$PATH:`pwd`
bash: PATH: command not found
如果空格是拼写错误,并且您实际运行了此命令:
PATH=$PATH:`pwd`
然后,这将在当前 shell 会话期间(直到您关闭终端)将当前目录(pwd
打印当前目录路径的命令,并将`pwd`
替换为的输出pwd
)添加到变量中。举例来说:PATH
$ pwd
/home/terdon/foo ## I am in /home/terdon/foo
$ echo $PATH ## the current PATH
/home/terdon/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
$ PATH=$PATH:`pwd`
$ echo $PATH
/home/terdon/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/terdon/foo
注意当前目录是如何/home/terdon/foo
添加到变量末尾的PATH
。
答案2
错误
就你原来的命令而言, terdon 的回答已经很好地涵盖了正在发生的事情和应该发生的事情。让我们更详细地分析一下。
您要尝试执行的是变量赋值,其形式应为:
varName=value
但是,由于空格的原因,这被视为一个PATH
带有命令行参数的命令,该命令由=
变量的内容$PATH
和命令替换组成pwd
,所有这些都连接到同一个字符串中:
PATH =$PATH:`pwd`
当然,没有这样的命令PATH
,因此您会收到错误。
Shell 将简单命令及其参数视为一个或多个空格分隔的标记列表(可能之前有可选的变量赋值)。换句话说,格式应该是:
[VAR=value] word [arg1 [arg2 [arg3] ]...]
当然,这并不是本案所期望的。
正确的命令
所以呢应该做的这是:
PATH=$PATH:`pwd`
这里我们有适当的变量赋值,根据扩展顺序,bash
shell 首先会执行变量扩展,即$PATH
用当前变量中的内容替换,然后在运行时执行命令替换pwd
,并将其替换为 的输出pwd
。最后,将所有内容分配回PATH
变量。
几个关键的观察结果:
- 由于这是变量赋值,因此您不需要引用
$PATH
变量,但通常应该这样做以避免不良行为。请参阅何时需要双引号 - 命令替换的反引号形式是现在不推荐。在这个特殊情况下,这是可以的,但一般来说,反引号并不适合嵌套和多行命令。
PATH
shell 使用变量来查找命令,列表中目录的顺序决定了搜索命令的优先级。例如,当你执行一个命令时,shell 首先会检查该命令是否内置,如果不是,那么它将查看PATH
变量上的所有目录。PATH=$PATH:$(pwd)
将使 shell 遍历其他所有内容,然后才到达 给出的目录pwd
。 相比之下,PATH=$(pwd):$PATH
将从 first 返回的目录开始搜索pwd
。 因此赋值的顺序很重要。