Como executar o comando shell produzido usando echo e sed?

1

Eu tentei fazer:

echo " mv /server/today/logfile1 /nfs/logs/ && gzip /nfs/logs/logfile1" | sed 's|logfile1|logfile2|g'

Impresso:

mv /server/today/logfile2 /nfs/logs/ && gzip /nfs/logs/logfile2

que é um comando bash. Como posso fazer com que seja executado, em vez de apenas imprimi-lo?

    
por rɑːdʒɑ 20.11.2015 / 15:25

2 respostas

4

Você pode enviar seu comando para um shell para que seja executado:

echo "mv ..." | bash

Ou você poderia passar isso como um argumento para um shell:

bash -c "$(echo "mv ...")"

Ou você pode usar o bash eval :

eval "$(echo "mv ...")"

Note, no entanto, que todos esses comandos geradores de código parecem um pouco frágeis para mim (existem maneiras que eles falharão assim que alguns dos caminhos contiverem espaços, etc.).

    
por 20.11.2015 / 15:39
2

Você está reimplementando a substituição do histórico.

$ mv /server/today/logfile1 /nfs/logs/ && gzip /nfs/logs/logfile1
$ !!:gs/logfile1/logfile2

Se você ainda não executou o primeiro comando e deseja apenas executar um conjunto de comandos semelhantes, considere um loop:

for f in logfile logfile2; do
    mv /server/today/"$f" /nfs/logs && gzip /nfs/logs/"$f"
done
    
por 20.11.2015 / 19:41