如何执行使用echo和sed生成的shell命令?

如何执行使用echo和sed生成的shell命令?

我尝试过这样做:

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

它打印:

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

这是一个 bash 命令。我怎样才能让它被执行,而不是仅仅打印它?

答案1

您可以将命令通过管道传输到 shell 中,以便执行它:

echo "mv ..." | bash

或者您可以将其作为参数传递给 shell:

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

或者您可以使用内置的 bash eval

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

但请注意,所有这些代码生成命令对我来说看起来都有点脆弱(一旦某些路径包含空格等,它们就会失败)。

答案2

您正在重新实现历史替换。

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

如果您尚未实际执行第一个命令,而只想执行一组类似的命令,请考虑使用循环:

for f in logfile logfile2; do
    mv /server/today/"$f" /nfs/logs && gzip /nfs/logs/"$f"
done

答案3

也可以通过以下方式完成xargs

echo "mv ..." | sed "..." | xargs command

例子:

$ echo "whoareyou" | sed "s/areyou/ami/g" | xargs command

username
  • 如果有&&或类似,您还需要eval
$ echo "whoareyou && whoareyou" | sed "s/areyou/ami/g" | xargs command eval

username
username

还可以打印执行的命令:

  • xargs -t
$ echo "whoareyou && whoareyou" | sed "s/areyou/ami/g" | xargs -t command eval

command eval whoami '&&' whoami
username
username
  • tee
echo "whoareyou && whoareyou" | sed "s/areyou/ami/g" | tee >(sh)

whoami && whoami
username
username

相关内容