Bash 在同一命令行中指定并展开shell变量
我想在shell中命令行的开头指定一个或多个变量,以便在命令调用中重用它。我对shell的行为感到困惑,想了解发生了什么 我使用的是ZSH,但也对posix的“标准”行为感兴趣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
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