armazena e executa o redirecionamento / comando canalizado no script

2

Como você armazena e depois executa um comando com redirecionamento e um pipe? (E é o pipe, ou o redirecionamento, ou ambos, que está causando o meu problema?)

Eu tentei imprimir a versão do urxvt em um script, bem como ecoar o comando real.

O comando que eu uso para obter a versão é urxvt -help 2>&1 | head -n 2 - por algum motivo, urxvt imprime ajuda para stderr ; quanto ao head , apenas as duas primeiras linhas contêm dados de versão e configuração.

No shell, funciona muito bem, mas, no script (isolado do problema, abaixo), parece que a terceira linha perde a cabeça:

#!/bin/bash

VER_URXVT='urxvt -help 2>&1 | head -n 2'
echo $VER_URXVT
$VER_URXVT
    
por Emanuel Berg 22.12.2012 / 23:28

4 respostas

1

Você precisa usar a expressão eval

#!/bin/bash

VER_URXVT='urxvt -help 2>&1 | head -n 2'
echo $VER_URXVT
eval $VER_URXVT

Da página de manual 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.
    
por 22.12.2012 / 23:58
4

Uso:

VER_URXVT='urxvt -help 2>&1 | head -n 2'

que é o mesmo que:

VER_URXVT=$(urxvt -help 2>&1 | head -n 2)

para obter as duas primeiras linhas de urxvt help em VER_URXVT .

Se você quiser avaliar o comando na variável shell, use eval :

VER_URXVT='urxvt -help 2>&1 | head -n 2'
eval $VER_URXVT
    
por 23.12.2012 / 00:09
3

Eu continuo pensando que as funções são melhores que eval uing variables

#!/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
    
por 23.12.2012 / 02:31
2

nunca use eval , a menos que você realmente saiba o que será eval ed.

em vez disso, use uma função.

#!/bin/bash

ver_urxvt() { urxvt -help 2>&1 | head -n 2;}
declare -f ver_urxvt | sed '1,2d; $d'
ver_urxvt

mas é bobagem, pois é uma perda de tempo imprimir essas informações.

se você quiser depurar seu script, use a opção -x do set builtin

    
por 23.12.2012 / 00:19