0

在 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

错误的原因可能是什么?

4

1 回答 1

1

如果函数的目的是执行某个 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解释事物本身。见$*$@

于 2016-09-30T11:16:27.450 回答