如何使zsh在命令替换失败时整个行失败?

3

如果我执行:

$(blah) bleh

我明白了

zsh: command not found: blah
zsh: command not found: bleh

这让我有些担心,因为它意味着zsh正在执行bleh,而这从未被设计成一个命令;如果它可以被执行并做了我不想要的事情怎么办?

有没有一种方式可以使整行在blah失败时立即失败?

2个回答

2
< p > 之所以会尝试使用 bleh,是因为如果blah不存在,$(blah)将被替换为空字符串。在这种情况下,bleh将成为完全解析的命令行上的第一个单词,因此被解释为命令。

因此,您必须捕获空字符串并防止进一步执行。幸运的是,ZSH有一个参数扩展功能,即 ${name:?word},可以用于处理这种情况:

${$(blah):?No such thing} bleh

如果blah不存在,ZSH将打印No such thing并返回提示符(或退出shell,如果它是非交互式的):
zsh: : No such thing

否则它只是被替换的命令。
% alias blah="echo echo '>>>'"
% ${$(blah):?No such thing} bleh
>>> bleh

0
使用&&来分隔命令,如果失败则终止执行: $(blah) && bleh

我实际上并不想分开这些命令,而是将其作为一个单独的命令来执行。就像$(echo cat) /dev/null这样的例子。 - Owen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接