Zapisz wyniki wielu kolejnych poleceń w pliku tekstowym

22

Próbuję sprawdzić najnowszą przeglądarkę Firefox i chcę uzyskać wszystkie skróty w jednym pliku TXT.

Staram się:

sha1sum firefox.tar.gz > sha.txt

i próbuję również:

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

ale tylko ostatnia w tym przypadku sha512 jest drukowana na sha.txt.

Co ja robię źle? Czy ktoś może mi w tym pomóc?

XBMCuser
źródło

Odpowiedzi:

31

Jak inni zauważyli już różnicę między >(nadpisującymi) a >>(dołączającymi) operatorami przekierowań, podam kilka rozwiązań.

  1. Możesz użyć {}funkcji grupowania poleceń, bashaby wysłać dane wyjściowe wszystkich poleceń w jednym pliku:

    { sha1sum foo.txt ;sha512sum foo.txt ;md5sum foo.txt ;} >checksum.txt
  2. Alternatywnie możesz uruchomić polecenia w podpowłoce ():

    ( sha1sum foo.txt ;sha512sum foo.txt ;md5sum foo.txt ) >checksum.txt
heemayl
źródło
1
Które rozwiązanie jest uważane za bardziej ogólne / przenośne {}lub ()? Dziękuję Ci.
codeaviator,
5
@codeaviator podpowłoki: ().
heemayl
5

Musisz użyć append redirector >>zamiast >do kolejnych poleceń np

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 

Zobacz Appending Redirected Outputsekcję strony podręcznika bash ( man bash).

steeldriver
źródło
1

>Redirector pisze wyjścia polecenia ( stdout, a nie stderr- możesz użyć 2>do tego) do pliku podanego po niej. Jeśli już istnieje, plik zostanie zastąpiony.

To zachowanie jest przydatne w przypadku pierwszego polecenia: jeśli istnieje plik, należy go usunąć i zastąpić nowym.

Ponieważ jednak musisz zastąpić wszystkie dalsze dane wyjściowe zamiast zastąpić poprzednie, musisz użyć append-redirector >>. Spowoduje to utworzenie pliku, jeśli jeszcze nie istnieje, ale doda przekierowane wyjście do pliku, jeśli już istnieje.


I proszę nie używać potoku |do pisania wielu poleceń w jednym wierszu, co przekierowałoby wynik pierwszego polecenia ( stdout) do wejścia drugiego polecenia ( stdin).

Możesz użyć średnika ( ;), aby po prostu powiedzieć bashowi, aby wykonał jedno polecenie po drugim, tak jakby to był plik skryptu. Jeśli polecenie nie powiedzie się (kod powrotu nie jest równy 0), pozostałe polecenia nadal będą wykonywane.

Lub możesz wybrać operatory logiczne AND ( &&) lub OR ( ||):
Jeśli użyjesz &&do połączenia dwóch poleceń, drugie zostanie wykonane tylko wtedy , gdy pierwsze się powiedzie (kod powrotu to 0). Jeśli się nie powiedzie, żadne z poniższych poleceń nie zostanie uruchomione. Jednak tylko uruchamia drugie polecenie , jeśli pierwszy udało (kod zwrotny nie jest 0)!
||

Tak więc w twoim przypadku polecam użyć średnika:

md5sum firefox.tar.gz > sha.txt ; sha1sum firefox.tar.gz >> sha.txt ; sha512sum firefox.tar.gz >> sha.txt 
Bajt Dowódca
źródło