如何存储并稍后执行带有重定向和管道的命令? (是管道,还是重定向,或两者兼而有之,导致了我的问题?)
我尝试在脚本中打印 urxvt 版本,并回显实际命令。
我用来获取版本的命令是urxvt -help 2>&1 | head -n 2
- 由于某种原因,urxvt 将帮助打印到stderr
;至于head
,只有前两行包含版本和配置数据。
在 shell 中,它工作得很好,但是,在脚本中(下面隔离了问题),第三行似乎失去了意义:
#!/bin/bash
VER_URXVT='urxvt -help 2>&1 | head -n 2'
echo $VER_URXVT
$VER_URXVT
答案1
使用:
VER_URXVT=`urxvt -help 2>&1 | head -n 2`
与以下内容相同:
VER_URXVT=$(urxvt -help 2>&1 | head -n 2)
将前两行urxvt
帮助放入VER_URXVT
.
如果你想评估 shell 变量中的命令,你应该使用eval
:
VER_URXVT='urxvt -help 2>&1 | head -n 2'
eval $VER_URXVT
答案2
我一直认为函数比eval
使用变量更好
#!/bin/bash
version() { uname -a;}
wm() { head -n1 <(openbox --version);}
for f in $(compgen -A function)
do declare -f $f | sed '1,2d; $d'
$f
done
答案3
eval
除非您真的知道要编辑什么,否则永远不要使用eval
。
而是使用一个函数。
#!/bin/bash
ver_urxvt() { urxvt -help 2>&1 | head -n 2;}
declare -f ver_urxvt | sed '1,2d; $d'
ver_urxvt
但这很愚蠢,因为打印这些信息是浪费时间。
如果您想调试脚本,请使用内置-x
选项set
答案4
您需要使用 eval 表达式
#!/bin/bash
VER_URXVT='urxvt -help 2>&1 | head -n 2'
echo $VER_URXVT
eval $VER_URXVT
从手册页 eval
The args are read and concatenated together into a single com-
mand. This command is then read and executed by the shell, and
its exit status is returned as the value of eval. If there are
no args, or only null arguments, eval returns 0.