在同一shell命令中捕获返回代码



我想用另一个命令运行长时间运行的命令(30到40分钟(,该命令会发送带有第一个命令返回代码的短信。例如command 1; sms,其中sms是一个别名,它只接受command 1的返回代码并在文本消息中发送它。

如何访问;之前的命令的退出代码?

我试图对它使用$?,但它保留了上一个命令的退出代码,而不是;之前的命令,因为它是同一命令的一部分。

在我的~/.zshrc文件-中

alias sms="twilio api:core:messages:create --to '+1**********' --from '+**********' --body 'exit code:$?'"

我想做的事:

~ » hello; sms 

发送退出代码为0的短信。总是需要发送1。

~ » hello; alias | grep sms                                                                                                                                                                              
zsh: command not found: hello                                                                                                                                                                                   
sms='twilio api:core:messages:create --to '''+1**********''' --from '''+1**********''' --body '''exit code:0'' 

在这里它应该发送一个1。

您的别名如下:

alias sms="twilio --body 'exit code:$?'"

这里发生的情况是,当定义别名时,$?变量在双引号中展开,但在运行别名时不展开。因此,这与将别名定义为相同:

alias sms="twilio --body 'exit code:0'"

您可以通过使用alias sms打印定义后的别名来看到这一点:

% alias sms="twilio --body 'exit code:$?'"
% alias sms
sms='twilio --body '''exit code:0''

要解决此问题,请将外引号更改为单引号:

alias sms='twilio --body "exit code:$?"'

或者,使用一个函数来代替,它可以消除双重引用,这通常是令人困惑和难以处理的:

sms() {
twilio --body "exit code:$1"
}
hello; sms $?

这里不需要传递$?作为参数(也可以在函数中使用$?(,但我发现通常最好尽快显式捕获$?,因为很容易被新命令意外覆盖。

相关内容

  • 没有找到相关文章

最新更新