我想在外壳程序的命令行开头分配一个或多个变量,以在命令调用中重用它。我对我的外壳的行为感到困惑,并想了解正在发生的事情。
我正在使用ZSH,但也对“标准” posix行为是什么感兴趣。
1: % V=/ echo $V # echo is a shell built-in?!?
预期:/。实际:“”
2: % V=/ ls $V # ls is a command
预期:ls /。实际:ls
3: % V=/ ; echo $V
预期:“”。实际:/
[我认为分号将等效于新的外壳线,并且我需要export
。
4: % V=/ ; ls $V
预期:ls。实际:ls /
我对第1行和第2行感到非常惊讶。是否有任何ZSH设置可能导致此问题,或者我只是开始使用分号以这种方式使用变量?
可变扩展发生在命令运行之前,即在第1行和第2行中将值分配给变量之前。
export
当您需要将变量导出到子shell时需要。分号不会引入子外壳,而是使分配在下一个命令之前运行,因此外壳现在将变量扩展为其新值。
如果允许变量扩展出现在echo
内部并且不强制执行,例如echo
可以运行之前,您的第1行将起作用,>
V=/ zsh -c 'echo $V'
或通过
V=/ eval 'echo $V'
echo
是内置命令没关系。同样的想法适用于每个命令。
由于命令可以用分号或换行符分隔,所以第3行等效于
V=/ echo $V
这很明显,为什么在这种情况下替换有效。