我尝试过这样做:
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