複数のシーケンシャルコマンドの出力をテキストファイルに書き込む


22

最新のFirefoxをチェックして、1つのTXTファイルですべてのハッシュを取得しようとしています。

私がやろうとしているのは:

sha1sum firefox.tar.gz > sha.txt

そして私も試してみます:

md5sum firefox.tar.gz > sha.txt | sha1sum firefox.tar.gz > sha.txt | sha512sum firefox.tar.gz > sha.txt 

ただし、この場合は最後のsha512のみがsha.txtに出力されます。

何が間違っていますか?誰かが私を助けてくれますか?

回答:


31

他の人が>(上書き>>)リダイレクト演算子と(追加)リダイレクト演算子の違いをすでに指摘しているので、いくつかの解決策を示します。

  1. コマンドのグループ化{}機能を使用してbash、すべてのコマンドの出力を単一のファイルに送信できます。

    { sha1sum foo.txt ;sha512sum foo.txt ;md5sum foo.txt ;} >checksum.txt
  2. または、サブシェルでコマンドを実行できます()

    ( sha1sum foo.txt ;sha512sum foo.txt ;md5sum foo.txt ) >checksum.txt

1
どちらのソリューションは、よりポータブル/汎用的な考えられています{}()?ありがとうございました。
codeaviator

5
@codeaviatorサブシェル:()
heemayl

5

次のコマンドでは>>なく、appendリダイレクターを使用する必要があり>ます。

sha1sum zeromq-4.1.2.tar.gz > sha.txt
md5sum zeromq-4.1.2.tar.gz  >> sha.txt 
sha512sum zeromq-4.1.2.tar.gz >> sha.txt 

Appending Redirected Outputbashのマニュアルページ(man bash)のセクションを参照してください。


1

>リダイレクタは、コマンドの出力(書き込みstdout、ではないstderr-あなたが使用し2>たファイルへのそれの後に指定しているため)。既に存在する場合、ファイルは上書きされます。

この動作は、最初のコマンドで役立ちます。既存のファイルがある場合は、削除して新しいファイルで置き換える必要があります。

ただし、以前の出力を置き換えるのではなく、さらにすべての出力を追加する必要があるため、append-redirectorを使用する必要があります>>。これにより、ファイルがまだ存在しない場合は作成されますが、リダイレクトされた出力が既に存在する場合はファイルに追加されます。


また、パイプ|を使用して複数のコマンドを1行に記述しないでください。最初のコマンドの出力(stdout)が2番目のコマンドの入力(stdin)にリダイレクトされます。

セミコロン(;)を使用して、bashに1つのコマンドをスクリプトファイルであるかのように実行するよう指示することができます。コマンドが失敗した場合(戻りコードが0でない場合)、残りのコマンドは引き続き実行されます。

または、論理演算子AND(&&)またはOR(||)を選択できます:2つのコマンドを接続するために
使用&&する場合、最初のコマンドが成功した場合にのみ、2番目のコマンドが実行されます(戻りコードは0)。失敗すると、次のコマンドは実行されません。しかし、唯一の 2番目のコマンドを実行します最初の1が失敗した場合(リターンコードが0ではありません)!
||

したがって、あなたの場合、セミコロンを使用することをお勧めします:

md5sum firefox.tar.gz > sha.txt ; sha1sum firefox.tar.gz >> sha.txt ; sha512sum firefox.tar.gz >> sha.txt 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.