我想用另一个命令运行长时间运行的命令(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 $?
这里不需要传递$?
作为参数(也可以在函数中使用$?
(,但我发现通常最好尽快显式捕获$?
,因为很容易被新命令意外覆盖。