假设有人调用一个不存在的命令,我知道从我随后执行的脚本中检索其错误状态的唯一方法是使用source
即,假设该脚本的名称就是dummy
其内容所在的位置
#!/bin/bash
echo $?
我知道如果我调用,我只会获得我正在寻找的退出状态(127)source dummy
,但是有另一种方法可以帮助alias
从脚本内的最后一个命令获取退出状态(最好不使用),而不使用source
所以我可以简单地打电话dummy
来获得我想要的行为吗?
我只是想编写一个脚本来检查上一个命令中的拼写错误。这需要检测之前的退出状态,以确保首先存在潜在的拼写错误,因此我需要能够从脚本中获取最后一个命令的退出状态。我还希望最大限度地减少用户必须执行的设置量,以便用户可以简单地调用dummy
,例如,其余的将被处理。这就是我试图避免source
“或” .
、“或”的原因alias
。
我对最后一个命令的退出状态的初始测试是使用
#!/bin/bash
ESTATUS=$? # Saved exit status for later
echo $ESTATUS
但这需要使用source
.有没有一种好方法可以复制这个而不必使用source
, or .
?
答案1
您也许可以使用该脚本https://github.com/rcaloras/bash-preexec(正如讨论的https://superuser.com/questions/175799/does-bash-have-a-hook-that-is-run-before-executing-a-command)并使用 precmd() 函数来执行 $?检查
答案2
我不太确定这会导致什么结果,但你可以这样做:
alias dummy='sh dummy $?'
the_program_with_errors
dummy
你的dummy
脚本将包含:
echo $1
没有的方法alias
是使用 shell 函数:
function dummy { sh dummy $? ;}
通过该定义,您可以获得以下行为(使用 、 和子 shell 进程进行模拟true
)false
:
$ true
$ dummy
0
$ false
$ dummy
1
$ (exit 42)
$ dummy
42
答案3
在我看来,您调用的脚本应该提供您想要的响应。这是测试命令并在这些脚本中使用特定退出代码的方法。
#!/bin/bash
# Test for the existence of a command in the path.
command=typo_command
if [[ ! $(command -v $command) ]]; then
echo "$command does not exist"
exit 127 # or the code you choose
fi
答案4
写一个函数
您的 shell 是一个进程,并且具有 的值$?
。您的脚本是一个单独的子进程,并且有其自身的价值$?
。
如果您希望能够检查$?
属于您的 shell,您需要在 shell 进程中运行您的命令。source
是一种方法,但更简单的方法是编写一个函数。
function dummy(){
echo $?
}
如果在用户.bashrc
或等效项中声明,则它应该可用并按您的预期工作。
(如果您愿意,它甚至可以调用脚本来执行您想要的任何其他操作,并将 的值传递给脚本$?
。)