簡體   English   中英

在bash腳本問題中將命令設置為變量

[英]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變量。
  • 為腳本啟用bash的歷史記錄功能,並使用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 -xset -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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM