1. ホーム
  2. bash

[解決済み] シェルで複数のコマンドを1行で実行する

2022-03-22 22:20:01

質問

あるファイルがあるとする /templates/apple で、次のようにしたい。

  1. を2か所に置いてから
  2. を削除してください。

だから /templates/apple にコピーされます。 /templates/used AND /templates/inuse で、その後にオリジナルを削除したいと思います。

cp が最適で、その後に rm ? それとも、もっと良い方法があるのでしょうか?

一行で済ませたいので、以下のような感じになるかと思います。

cp /templates/apple /templates/used | cp /templates/apple /templates/inuse | rm /templates/apple

この構文は正しいですか?

どのように解決するのですか?

を使用しています。 | (パイプ) を使って、あるコマンドの出力を別のコマンドに導くことができます。あなたが探しているものは && 演算子で、前のコマンドが成功した場合のみ、次のコマンドを実行します。

cp /templates/apple /templates/used && cp /templates/apple /templates/inuse && rm /templates/apple

または

cp /templates/apple /templates/used && mv /templates/apple /templates/inuse


bashのコマンド演算子/区切り文字を(非網羅的に)まとめると。

  • | は、標準出力をパイプ(pipelines)する( stdout を別のコマンドの標準入力に変換します。ただし stderr は、それがどのようなものであれ、デフォルトの宛先に送られます。
  • |& の両方をパイプします。 stdoutstderr を別のコマンドの標準入力に取り込む。非常に便利で、bashのバージョン4以降で利用可能。
  • && の右側のコマンドを実行します。 && が成功した場合のみ。
  • || の右側のコマンドを実行します。 || が失敗したときだけです。
  • ; の右側のコマンドを実行します。 ; は、直前のコマンドが成功したか失敗したかにかかわらず、常に ただし set -e が呼び出された場合、その前に呼び出された bash を実行すると、エラーで失敗します。