问题
我想将一个命令保存到一个变量中,以便稍后再使用(不是命令的输出,而是命令本身)。
我有一个简单的脚本如下:
代码语言:javascript复制command="ls";
echo "Command: $command"; #Output is: Command: ls
b=`$command`;
echo $b; #Output is: public_html REV test... (command worked successfully)
然而,当我尝试一些更复杂的东西时,它失败了。例如,如果我做
代码语言:javascript复制command="ls | grep -c '^'";
输出为:
代码语言:javascript复制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
我如何将这样(带有管道/多个命令)的命令存储在变量中以供以后使用?
回答
对于带有管道或重定向的组合命令最推荐的方式是将其封装到一个函数里,然后在需要时直接调用即可。
对于命令 ls | grep -c '^'
可以写为如下形式:
func1() {
ls | grep -c '^'
}
cd /path/to/work
# when need
func1
如果需要将 func1
写为一行,则代码如下:
func1() { ls | grep -c '^'; }
这里需要在 {}
里面命令的末尾加上分号 ;
。
一个高赞回答是使用 eval
,代码如下:
x="ls | wc"
eval "$x"
y=$(eval "$x")
echo "$y"
但是其中 eval
是一个非常容易引发错误的内置命令,在没有警告用户可能存在不可预料的解析行为风险的情况下,不应推荐使用它。使用 eval
命令时需要非常小心,因为它可以使得代码可读性较差并且容易引入安全漏洞。朋友们有踩到过 eval
命令的坑吗,可以在评论区留言交流一下。
参考
- stackoverflow question 5615717
- help eval