由网友(盛夏彼岸花开)分享简介:我想写这样的代码:command="some command"safeRunCommand $commandsafeRunCommand() {cmnd=$1$($cmnd)if [ $? != 0 ]; thenprintf "Error when executing command: '$command'"exi...
我想写这样的代码:
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"
现在,如果您查看这段代码,我更改的几项内容如下:
使用typeset
不是必需的,但这是一个很好的实践。它使cmnd
和ret_code
成为safeRunCommand
的本地
使用ret_code
不是必需的,但最好将返回代码存储在某个变量中(并尽快存储),以便以后可以像我在printf "Error: [%d] when executing command: '$command'" $ret_code
中那样使用它
传递命令时使用引号将命令引起来,如safeRunCommand "$command"
。如果不这样做,cmnd
将只获得值ls
,而不是ls -l
。如果您的命令包含管道,则更重要。
如果您想保留空格,可以使用typeset cmnd="$*"
而不是typeset cmnd="$1"
。根据命令参数的复杂程度,您可以同时尝试这两种方法。
‘val’用于计算,以便包含管道的命令可以正常工作
注意:请记住,有些命令将1作为返回码,即使没有任何类似grep
的错误。如果grep
找到某项内容,则返回0,否则返回1。
我使用KornShell和Bash进行了测试。而且它运行得很好。如果您在运行此程序时遇到问题,请通知我。
相关推荐
最新文章