echoとsedを使用して生成されたシェルコマンドを実行するには?

echoとsedを使用して生成されたシェルコマンドを実行するには?

私はこれを試しました:

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

関連情報