在同一命令行中分配和扩展shell变量

问题描述 投票:0回答:2

我想在外壳程序的命令行开头分配一个或多个变量,以在命令调用中重用它。我对我的外壳的行为感到困惑,并想了解正在发生的事情。

我正在使用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设置可能导致此问题,或者我只是开始使用分号以这种方式使用变量?

bash shell posix zsh variable-expansion
2个回答
1
投票

可变扩展发生在命令运行之前,即在第1行和第2行中将值分配给变量之前。

export当您需要将变量导出到子shell时需要。分号不会引入子外壳,而是使分配在下一个命令之前运行,因此外壳现在将变量扩展为其新值。


0
投票

如果允许变量扩展出现在echo内部并且不强制执行,例如echo可以运行之前,您的第1行将起作用,>

V=/ zsh -c 'echo $V'

或通过

V=/ eval 'echo $V'

echo是内置命令没关系。同样的想法适用于每个命令。

由于命令可以用分号或换行符分隔,所以第3行等效于

V=/
echo $V

这很明显,为什么在这种情况下替换有效。

© www.soinside.com 2019 - 2024. All rights reserved.