在脚本中存储和执行重定向/管道命令

在脚本中存储和执行重定向/管道命令

如何存储并稍后执行带有重定向和管道的命令? (是管道,还是重定向,或两者兼而有之,导致了我的问题?)

我尝试在脚本中打印 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.

相关内容