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 $@
。
在 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 $@
。