Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 在同一命令行中指定并展开shell变量_Bash_Shell_Posix_Zsh_Variable Expansion - Fatal编程技术网

Bash 在同一命令行中指定并展开shell变量

Bash 在同一命令行中指定并展开shell变量,bash,shell,posix,zsh,variable-expansion,Bash,Shell,Posix,Zsh,Variable Expansion,我想在shell中命令行的开头指定一个或多个变量,以便在命令调用中重用它。我对shell的行为感到困惑,想了解发生了什么 我使用的是ZSH,但也对posix的“标准”行为感兴趣 1: % V=/ echo $V # echo is a shell built-in?!? 预期:/。实际:“” 预期:ls/。实际:ls 3: % V=/ ; echo $V 预期:“。实际:/ 在这里,我认为分号相当于一个新的shell行,我需要导出 4: % V=/ ; ls $V 预期:ls。实际:l

我想在shell中命令行的开头指定一个或多个变量,以便在命令调用中重用它。我对shell的行为感到困惑,想了解发生了什么

我使用的是ZSH,但也对posix的“标准”行为感兴趣

1: % V=/ echo $V   # echo is a shell built-in?!?
预期:/。实际:“”

预期:ls/。实际:ls

3: % V=/ ; echo $V
预期:“。实际:/

在这里,我认为分号相当于一个新的shell行,我需要
导出

4: % V=/ ; ls $V
预期:ls。实际:ls/


我对第一行和第二行感到非常惊讶。是否有任何ZSH设置会导致这种情况,或者我只是开始使用分号以这种方式使用变量?

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


当需要将变量导出到子shell时,需要导出
。分号不会引入子shell,但会导致在下一个命令之前运行赋值,因此shell现在会按其新值展开变量。

如果允许变量在
echo
内部展开,并且在
echo
有机会运行之前不强制展开,则第1行可以工作,例如

V=/ zsh -c 'echo $V'
或者

echo
是内置命令并不重要。同样的想法适用于每个命令

因为命令可以用分号或换行符分隔,所以第3行相当于

V=/
echo $V

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

echo
没有使用环境。它甚至不知道正在使用一个变量;它以
V
的值作为参数,而不是字符串
$V
。我想我找到了完美的答案:
V=/ eval 'echo $V'
V=/
echo $V