写一个函数

写一个函数

假设有人调用一个不存在的命令,我知道从我随后执行的脚本中检索其错误状态的唯一方法是使用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 进程进行模拟truefalse

$ 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或等效项中声明,则它应该可用并按您的预期工作。

(如果您愿意,它甚至可以调用脚本来执行您想要的任何其他操作,并将 的值传递给脚本$?。)

相关内容