Bash函数不执行输入命令

Bash function not executing the input command

在 bash 文件 s.sh 中,我有一个 Executor 函数,我将要执行的命令传递给该函数。每当某些命令没有按预期工作时,此函数将输出命令。

Executor()
{
    if ! $*
    then
        echo "$*"
        exit 2
    fi
}

现在我正在调用这个函数 -

Executor clangPath="Hello" make(这个用来在makefile中设置clangPath变量的值为"Hello")

这导致了错误 -

./s.sh: line 5: clangPath=Hello: command not found
[./s.sh] Error: clangPath=Hello make

然而,像这样执行相同的命令工作正常

if ! clangPath="Hello" make
then
    echo "HelloWorld!"
fi

看了报错,觉得可能是字符串引号有误,于是试了一下

exitIfFail clangPath='"Hello"' make

即使这样也会导致错误 -

./s.sh: line 5: clangPath="Hello": command not found
[./s.sh] Error: clangPath="Hello" make

错误的原因可能是什么?

如果函数的目的是执行一些Bash表达式,然后打印一条错误消息,如果表达式失败(返回非零状态),那么,有一种方法可以通过eval:

#!/bin/bash -

function Executor()
{
  eval "$@"

  if [ $? -ne 0 ]
  then
    echo >&2 "Failed to execute command: $@"
    exit 2
  fi
}

$?变量保存了之前执行命令的退出状态。所以我们检查它是否非零。

另请注意我们如何将错误消息重定向到标准错误描述符。

用法:

Executor ls -lh /tmp/unknown-something
ls: cannot access /tmp/unknown-something: No such file or directory
Failed to execute command: ls -lh /tmp/unknown-something


Executor ls -lh /tmp
# some file listing here...

$@ 变量在这里更合适,因为 eval 解释事物本身。参见 $* and $@