
私はこれを試しました:
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
これはバッシュコマンドです。ただ印刷するのではなく、どのように実行することができますか?
答え1
コマンドをシェルにパイプすることで実行できます。
echo "mv ..." | bash
あるいは、それをシェルに引数として渡すこともできます。
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