Viết đầu ra của nhiều lệnh tuần tự vào một tệp văn bản


22

Tôi cố gắng Kiểm tra Firefox mới nhất và muốn nhận tất cả các giá trị băm trong một tệp TXT.

Những gì tôi cố gắng làm là:

sha1sum firefox.tar.gz > sha.txt

và tôi cũng thử:

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

nhưng chỉ cuối cùng trong trường hợp này, sha512 được in ra sha.txt.

Tôi đang làm gì sai? Xin vui lòng ai đó có thể giúp tôi với điều này?

Câu trả lời:


31

Như những người khác đã chỉ ra sự khác biệt giữa các toán tử chuyển hướng >(ghi đè) và >>(nối thêm), tôi sẽ đưa ra một vài giải pháp.

  1. Bạn có thể sử dụng {}tính năng nhóm lệnh của bashđể gửi đầu ra của tất cả các lệnh trong một tệp:

    { sha1sum foo.txt ;sha512sum foo.txt ;md5sum foo.txt ;} >checksum.txt
  2. Thay phiên, bạn có thể chạy các lệnh trong một lớp con ():

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

1
Những giải pháp được coi là chung chung hơn / di động {}hay ()? Cảm ơn bạn.
mã hóa

5
@codeaviator subshell : ().
heemayl

5

Bạn cần sử dụng trình chuyển hướng chắp thêm >>thay vì >cho các lệnh tiếp theo, vd

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 

Xem Appending Redirected Outputphần của trang hướng dẫn bash ( man bash).


1

Bộ >chuyển hướng ghi đầu ra của lệnh ( stdoutchứ không phải stderr- bạn sử dụng 2>cho mục đích đó) vào tệp được chỉ định sau nó. Nếu nó đã tồn tại, tập tin sẽ bị ghi đè.

Hành vi này hữu ích cho các lệnh đầu tiên của bạn: nếu có tệp hiện có, nó sẽ bị xóa và được thay thế bằng tệp mới.

Tuy nhiên, vì bạn cần nối thêm tất cả các đầu ra tiếp theo thay vì thay thế các đầu ra trước đó, bạn cần sử dụng phụ lục chuyển hướng >>. Điều này sẽ tạo một tệp nếu nó chưa tồn tại, nhưng nối thêm đầu ra được chuyển hướng vào tệp, nếu nó đã tồn tại.


Và xin vui lòng không sử dụng đường ống |để viết nhiều lệnh trong một dòng, điều này sẽ chuyển hướng đầu ra của lệnh thứ nhất ( stdout) sang đầu vào của lệnh thứ hai ( stdin).

Bạn có thể sử dụng dấu chấm phẩy ( ;) để chỉ bash thực thi một lệnh sau lệnh kia, như thể đó là một tệp script. Nếu một lệnh thất bại (mã trả về không phải là 0), các lệnh còn lại vẫn được thực thi.

Hoặc bạn có thể chọn các toán tử logic AND ( &&) hoặc OR ( ||):
Nếu bạn sử dụng &&để kết nối hai lệnh, lệnh thứ hai sẽ chỉ được thực thi, nếu lệnh đầu tiên thành công (mã trả về là 0). Nếu thất bại, không có lệnh nào sau đây sẽ chạy.
Các ||tuy nhiên chỉ chạy lệnh thứ hai nếu là người đầu tiên đã thất bại (mã trở lại không phải là 0)!

Vì vậy, trong trường hợp của bạn, tôi khuyên bạn nên sử dụng dấu chấm phẩy:

md5sum firefox.tar.gz > sha.txt ; sha1sum firefox.tar.gz >> sha.txt ; sha512sum firefox.tar.gz >> sha.txt 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.