我想写这样的代码:
command="some command"
safeRunCommand $command
safeRunCommand() {
cmnd=$1
$($cmnd)
if [ $? != 0 ]; then
printf "Error when executing command: '$command'"
exit $ERROR_CODE
fi
}
但这段代码并没有按照我想要的方式工作。我哪里犯了错误?
下面是固定代码:
#!/bin/ksh
safeRunCommand() {
typeset cmnd="$*"
typeset ret_code
echo cmnd=$cmnd
eval $cmnd
ret_code=$?
if [ $ret_code != 0 ]; then
printf "Error: [%d] when executing command: '$cmnd'" $ret_code
exit $ret_code
fi
}
command="ls -l | grep p"
safeRunCommand "$command"
现在,如果您查看这段代码,我更改的几件事是:
- use of
typeset
不是必要的,但这是一个很好的做法。它使cmnd
and ret_code
本地到safeRunCommand
- use of
ret_code
不是必需的,但将返回代码存储在某个变量中(并尽快存储)是一个很好的做法,这样您就可以像我一样稍后使用它printf "Error: [%d] when executing command: '$command'" $ret_code
- 传递带有引号的命令,例如
safeRunCommand "$command"
。如果你不这样做cmnd
只会得到值ls
并不是ls -l
。如果您的命令包含管道,则更为重要。
- 您可以使用
typeset cmnd="$*"
代替typeset cmnd="$1"
如果你想保留空格。您可以尝试两者,具体取决于命令参数的复杂程度。
- 'eval' 用于评估,以便包含管道的命令可以正常工作
注意:请记住一些命令1作为返回码,即使没有任何错误,例如grep
. If grep
发现某物将返回 0,否则返回 1。
我测试过康壳公司 https://en.wikipedia.org/wiki/KornShell and Bash https://en.wikipedia.org/wiki/Bash_%28Unix_shell%29。而且效果很好。如果您在运行此程序时遇到问题,请告诉我。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)