如何在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”。