[英]Set a command to a variable in bash script problem
嘗試將命令作為變量運行,但結果卻很奇怪
預期結果“ 1”:
grep -i nosuid /etc/fstab | grep -iq nfs
echo $?
1
意外的結果作為可變命令:
cmd="grep -i nosuid /etc/fstab | grep -iq nfs"
$cmd
echo $?
0
似乎它返回0,因為命令正確而不是實際結果。 如何做得更好?
您只能執行一個存儲在變量中的命令。 管道作為參數傳遞給第一個grep
。
例
$ printArgs() { printf %s\\n "$@"; }
# Two commands. The 1st command has parameters "a" and "b".
# The 2nd command prints stdin from the first command.
$ printArgs a b | cat
a
b
$ cmd='printArgs a b | cat'
# Only one command with parameters "a", "b", "|", and "cat".
$ $cmd
a
b
|
cat
如何做得更好?
不要使用變量執行命令。 使用功能。
$ cmd() { grep -i nosuid /etc/fstab | grep -iq nfs; }
$ cmd
$ echo $?
1
對於您的實際問題,我看到了三個選擇:
DEBUG
陷阱和BASH_COMMAND
變量。 hist
命令。 eval
執行它的eval
。 關於您對最后一種方法的評論:您只需要一個功能。 就像是
execAndLog() {
description="$1"
shift
if eval "$*"; then
info="PASSED: $description: $*"
passed+=("${FUNCNAME[1]}")
else
info="FAILED: $description: $*"
failed+=("${FUNCNAME[1]}")
done
}
您可以按以下方式使用此功能
execAndLog 'Scanned system' 'grep -i nfs /etc/fstab | grep -iq noexec'
第一個參數是日志的描述,其余參數是要執行的命令。
使用bash -x
或set -x
將允許您查看bash執行的內容:
> cmd="grep -i nosuid /etc/fstab | grep -iq nfs"
> set -x
> $cmd
+ grep -i nosuid /etc/fstab '|' grep -iq nfs
如您所見,您的煙斗|
作為參數傳遞給第一個grep命令。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.