如何在Linux中存储一个variables的命令?

我想存储一个命令,在稍后的一段时间使用一个variables(不是命令的输出,而是命令本身)

我有一个简单的脚本如下:

command="ls"; echo "Command: $command"; #Output is: Command: ls b=`$command`; echo $b; #Output is: public_html REV test... (command worked successfully) 

但是,当我尝试一些更复杂的东西时,它会失败。 例如,如果我做

 command="ls | grep -c '^'"; 

输出是:

 Command: ls | grep -c '^' ls: cannot access |: No such file or directory ls: cannot access grep: No such file or directory ls: cannot access '^': No such file or directory 

任何想法如何将这样的命令(与pipe道/多个命令)存储在一个variables供以后使用?

使用eval。

 x="ls | wc" eval $x y=`eval $x` echo $y 
 var=$(echo "asdf") echo $var # => asdf 

使用这种方法,立即评估命令并存储返回值。

 stored_date=$(date) echo $stored_date # => Thu Jan 15 10:57:16 EST 2015 # (wait a few seconds) echo $stored_date # => Thu Jan 15 10:57:16 EST 2015 

与反向相同

 stored_date=`date` echo $stored_date # => Thu Jan 15 11:02:19 EST 2015 # (wait a few seconds) echo $stored_date # => Thu Jan 15 11:02:19 EST 2015 

$(...)使用eval将不会在稍后进行评估

 stored_date=$(eval "date") echo $stored_date # => Thu Jan 15 11:05:30 EST 2015 # (wait a few seconds) echo $stored_date # => Thu Jan 15 11:05:30 EST 2015 

使用eval,评估何时使用eval

 stored_date="date" # < storing the command itself echo $(eval $stored_date) # => Thu Jan 15 11:07:05 EST 2015 # (wait a few seconds) echo $(eval $stored_date) # => Thu Jan 15 11:07:16 EST 2015 # ^^ Time changed 

在上面的例子中,如果你需要运行带有参数的命令,把它们放在你正在存储的string中

 stored_date="date -u" # ... 

对于bash脚本来说,这是很less有意义的,但最后一个注释。 小心eval 。 只评估您控制的string,不要来自不可信用户的string或不可信用户input的内容。

不要使用eval ! 它引入了任意代码执行的主要风险。

BashFAQ-50 – 我试图把一个命令放在一个variables中,但复杂的情况总是失败。

把它放在一个数组中,并用双引号"${arr[@]}"展开所有的单词,不让IFS拆分由于分词造成的单词 。

 cmdArgs=() cmdArgs=('date' '+%H:%M:%S') 

并看到数组里面的内容,

 declare -p cmdArgs declare -a cmdArgs='([0]="date" [1]="+%H:%M:%S")' 

并执行命令

 "${cmdArgs[@]}" 23:15:18 

(或者)共用一个bash函数来运行命令,

 cmd() { date '+%H:%M:%S' } 

并调用该函数

 cmd 

即使您稍后需要使用它,也不需要将variables存储在variables中。 按正常方式执行。 如果你存储variables,你需要某种eval语句或调用一些不必要的shell进程来“执行你的variables”。