Câu hỏi Làm cách nào để lưu đầu ra của thiết bị đầu cuối vào một tệp?


Làm cách nào để lưu đầu ra của lệnh vào một tệp?

Có cách nào không sử dụng bất kỳ phần mềm nào không? Tôi muốn biết làm thế nào.


397
2018-02-14 19:49


gốc




Các câu trả lời:


Có, nó có thể, chỉ cần chuyển hướng đầu ra vào một tập tin:

someCommand > someFile.txt  

Hoặc nếu bạn muốn nối thêm dữ liệu:

someCommand >> someFile.txt

Nếu bạn muốn stderr quá sử dụng này:

someCommand &> someFile.txt  

hoặc điều này để nối thêm:

someCommand &>> someFile.txt  

390
2018-02-14 19:52



Lưu ý rằng someCommand 2> someFile.txt và someCommand 2>> someFile.txt cũng chuyển hướng stterr tới someFile.txt - Slothworks
Tôi đang cố gắng làm điều này với lệnh gcc nhưng nó không hoạt động. Nó hoạt động với các lệnh khác, nhưng không phải là lệnh này. Nó chỉ đơn giản là tạo ra các tập tin đầu ra với không có gì bên trong nó. - Nik-Lz
@ Nik-Lz Thường thì điều này là bởi vì lệnh này đang gửi tất cả đầu ra của nó trên stderr. Nếu gcc tạo ra thông báo lỗi, điều này có vẻ như có khả năng xảy ra. Xem Slothworks nhận xét về cách chụp stderr thay vì stdout. - Jonathan Hartley
NB: để có được đầu ra của make lệnh vào một tập tin mà nó đòi hỏi cú pháp này thay vào đó: make > someFile.txt 2>&1 (nguồn: linuxquestions.org/questions/linux-newbie-8/…) - Gabriel Staples
@KyleBridenstine Xem tee Trả lời dưới đây (askubuntu.com/a/485762/44179) - Seth♦


Để viết đầu ra của lệnh vào một tệp, về cơ bản có 10 cách thường được sử dụng.

Tổng quan:

Xin lưu ý rằng n.e. trong cột cú pháp có nghĩa là "không tồn tại".
  Có một cách, nhưng nó quá phức tạp để phù hợp với cột. Bạn có thể tìm thấy một liên kết hữu ích trong phần Danh sách về nó.

          || visible in terminal ||   visible in file   || existing
  Syntax  ||  StdOut  |  StdErr  ||  StdOut  |  StdErr  ||   file   
==========++==========+==========++==========+==========++===========
    >     ||    no    |   yes    ||   yes    |    no    || overwrite
    >>    ||    no    |   yes    ||   yes    |    no    ||  append
          ||          |          ||          |          ||
   2>     ||   yes    |    no    ||    no    |   yes    || overwrite
   2>>    ||   yes    |    no    ||    no    |   yes    ||  append
          ||          |          ||          |          ||
   &>     ||    no    |    no    ||   yes    |   yes    || overwrite
   &>>    ||    no    |    no    ||   yes    |   yes    ||  append
          ||          |          ||          |          ||
 | tee    ||   yes    |   yes    ||   yes    |    no    || overwrite
 | tee -a ||   yes    |   yes    ||   yes    |    no    ||  append
          ||          |          ||          |          ||
 n.e. (*) ||   yes    |   yes    ||    no    |   yes    || overwrite
 n.e. (*) ||   yes    |   yes    ||    no    |   yes    ||  append
          ||          |          ||          |          ||
|& tee    ||   yes    |   yes    ||   yes    |   yes    || overwrite
|& tee -a ||   yes    |   yes    ||   yes    |   yes    ||  append

Danh sách:

  • command > output.txt

    Luồng đầu ra tiêu chuẩn sẽ được chuyển hướng đến tệp chỉ, nó sẽ không hiển thị trong thiết bị đầu cuối. Nếu tệp đã tồn tại, nó sẽ bị ghi đè.

  • command >> output.txt

    Luồng đầu ra tiêu chuẩn sẽ được chuyển hướng đến tệp chỉ, nó sẽ không hiển thị trong thiết bị đầu cuối. Nếu tệp đã tồn tại, dữ liệu mới sẽ được nối vào cuối tệp.

  • command 2> output.txt

    Luồng lỗi chuẩn sẽ được chuyển hướng đến tệp chỉ, nó sẽ không hiển thị trong thiết bị đầu cuối. Nếu tệp đã tồn tại, nó sẽ bị ghi đè.

  • command 2>> output.txt

    Luồng lỗi chuẩn sẽ được chuyển hướng đến tệp chỉ, nó sẽ không hiển thị trong thiết bị đầu cuối. Nếu tệp đã tồn tại, dữ liệu mới sẽ được nối vào cuối tệp.

  • command &> output.txt

    Cả đầu ra tiêu chuẩn và luồng lỗi chuẩn sẽ được chuyển hướng đến tệp chỉ, sẽ không có gì hiển thị trong thiết bị đầu cuối. Nếu tệp đã tồn tại, nó sẽ bị ghi đè.

  • command &>> output.txt

    Cả đầu ra tiêu chuẩn và luồng lỗi chuẩn sẽ được chuyển hướng đến tệp chỉ, sẽ không có gì hiển thị trong thiết bị đầu cuối. Nếu tệp đã tồn tại, dữ liệu mới sẽ được thêm vào cuối tệp ..

  • command | tee output.txt

    Luồng đầu ra tiêu chuẩn sẽ được sao chép vào tệp, nó sẽ vẫn hiển thị trong thiết bị đầu cuối. Nếu tệp đã tồn tại, nó sẽ bị ghi đè.

  • command | tee -a output.txt

    Luồng đầu ra tiêu chuẩn sẽ được sao chép vào tệp, nó sẽ vẫn hiển thị trong thiết bị đầu cuối. Nếu tệp đã tồn tại, dữ liệu mới sẽ được nối vào cuối tệp.

  • (*)

    Bash không có cú pháp viết tắt cho phép chỉ đường ống StdErr đến lệnh thứ hai, điều này sẽ cần thiết ở đây kết hợp với tee một lần nữa để hoàn thành bảng. Nếu bạn thực sự cần một cái gì đó như thế, hãy nhìn vào "Làm thế nào để ống stderr, và không stdout?" trên Stack Overflow đối với một số cách có thể thực hiện điều này, ví dụ: bằng cách hoán đổi luồng hoặc sử dụng thay thế quy trình.

  • command |& tee output.txt

    Cả đầu ra tiêu chuẩn và luồng lỗi chuẩn sẽ được sao chép vào tệp trong khi vẫn hiển thị trong thiết bị đầu cuối. Nếu tệp đã tồn tại, nó sẽ bị ghi đè.

  • command |& tee -a output.txt

    Cả đầu ra tiêu chuẩn và luồng lỗi chuẩn sẽ được sao chép vào tệp trong khi vẫn hiển thị trong thiết bị đầu cuối. Nếu tệp đã tồn tại, dữ liệu mới sẽ được nối vào cuối tệp.


539
2018-02-08 14:52



Cảm ơn cho bảng, nó tuyệt vời! Đây sẽ là câu trả lời hàng đầu - DevShark
@ karthick87 Điều này không thực sự liên quan đến câu hỏi về việc chuyển hướng đầu ra sang một tệp, bởi vì nó chỉ chuyển hướng một luồng sang một luồng khác. 2>&1 chuyển hướng STDERR sang STDOUT, 1>&2 chuyển hướng STDOUT sang STDERR và 3>&1 sẽ chuyển hướng luồng 3 đến STDERR. - Byte Commander
Chỉ cần lưu ý rằng '| &' không hoạt động đối với tôi trên hệ điều hành MacOS. Điều này là do nó có một phiên bản cũ của bash (tôi nghĩ). '2> & 1 | ít thanh lịch hơn' hoạt động tốt mặc dù - Danny Parker
những gì về n, y, y, y? - user1133275
@Jas để chuyển hướng cả hai stderr (2) và stdout (1) suối. - Byte Commander


Bạn cũng có thể dùng tee để gửi đầu ra tới một tệp:

command | tee ~/outputfile.txt

Một sửa đổi nhỏ sẽ bắt stderr là tốt:

command 2>&1 | tee ~/outputfile.txt

hoặc hơi ngắn hơn và ít phức tạp hơn:

command |& tee ~/outputfile.txt

tee rất hữu ích nếu bạn muốn có thể nắm bắt đầu ra lệnh trong khi cũng xem nó trực tiếp.


81
2018-06-20 04:45



tee là hữu ích nếu bạn muốn có thể nắm bắt đầu ra lệnh trong khi cũng xem nó trực tiếp. Tạo dòng này Dũng cảm Aaron. Nó sẽ làm hai công việc tại một thời điểm. Cảm ơn bạn đã trả lời. - learner
Nó nói rằng & là bất ngờ, và không ghi nhật ký cùng lúc khi lệnh chạy. Tôi đang sử dụng này trong một tập tin bash tuy nhiên, điều đó làm cho bất kỳ sự khác biệt? - tim687
@ tim687 Tôi đã xóa chỉnh sửa đó. Xin lỗi về điều đó ... không phải là một phần của câu trả lời ban đầu của tôi. - Aaron
@Aaron Cảm ơn! tee sẽ nối thêm tập tin trong thời gian thực, phải không? Tôi có một kịch bản sao lưu mà tôi sử dụng để, lol, sao lưu máy tính của tôi, nhưng đăng nhập không phải là trong thời gian thực. Máy tính của tôi chuyển sang chế độ ngủ sau khi sao lưu xong và tệp nhật ký trống. Tôi có nên sử dụng lệnh khác để đăng nhập các lệnh không? - tim687
tỷ cảm ơn bro - Mahesha999


Bạn có thể chuyển hướng đầu ra lệnh tới một tệp:

your_command >/path/to/file

Để thêm đầu ra lệnh vào một tệp thay vì ghi đè nó, hãy sử dụng:

your_command >>/path/to/file

17
2018-02-14 19:52



Cảm ơn rất nhiều ! có bất kỳ giới hạn nào không? như kích thước tối đa của tệp? - led-Zepp
Kích thước tệp tối đa chỉ bị giới hạn thông qua hệ thống tệp - chaos
Câu trả lời này sẽ không tiết kiệm được stderr. Sử dụng &>, xem stackoverflow.com/questions/637827/… và tldp.org/LDP/abs/html/io-redirection.html - Panther
OP không bao giờ yêu cầu để lưu stderr - chaos


Nâng cao để xem xét -

Các tập lệnh khác nhau sẽ chèn mã màu vào đầu ra mà bạn có thể không muốn làm lộn xộn tệp nhật ký của mình.

Để khắc phục điều này, bạn có thể sử dụng chương trình quyến rũ để loại bỏ các mã đó. Thí dụ:

command 2>&1 | sed -r 's/'$(echo -e "\033")'\[[0-9]{1,2}(;([0-9]{1,2})?)?[mK]//g' | tee ~/outputfile.txt

11
2017-07-08 20:57



Làm thế nào để tiết kiệm đầu ra theo cách mà màu sắc được bảo tồn? Tôi muốn nhập kết quả của một lệnh trong libreoffice và giữ màu sắc. - madrang
@madrang: Tôi chỉ đọc nhận xét của bạn ngay bây giờ nhưng bạn có thể tìm thấy câu trả lời hữu ích. - Sylvain Pineau
Ồ, gần như chính xác những gì tôi đang tìm kiếm. Làm thế nào để in cũng trên màn hình đầu ra? - Sigur
Lưu ý rằng nhiều lệnh tạo ra đầu ra được tô màu, chẳng hạn như ls và grep, ủng hộ --color=autochỉ xuất các mã màu nếu đầu ra tiêu chuẩn là một đầu cuối. - Eliah Kagan


Dành cho cron công việc vv bạn muốn tránh các phần mở rộng Bash. POSIX tương đương sh các toán tử chuyển hướng là

Bash            POSIX
--------------  --------------
foo &> bar      foo >bar 2&>1
foo &>> bar     foo >>bar 2>&1
foo |& bar      foo 2>&1 | bar

Bạn sẽ nhận thấy rằng cơ sở POSIX có ý nghĩa đơn giản và đơn giản hơn. Các &> cú pháp được mượn từ csh mà nên đã thuyết phục bạn rằng đó là một ý tưởng tồi.


1
2018-04-11 12:25





some_command | tee command.log và some_command > command.log có vấn đề là họ không lưu đầu ra lệnh vào command.log tệp trong thời gian thực.

Để tránh vấn đề đó và lưu đầu ra lệnh trong thời gian thực, bạn có thể nối thêm unbuffer, đi kèm với expect gói.


Thí dụ:

sudo apt-get install expect
unbuffer some_command | tee command.log
unbuffer some_command > command.log

Giả định log.py chứa đựng:

import time
print('testing')
time.sleep(100) # sleeping for 100 seconds

bạn có thể chạy unbuffer python log.py | tee command.log hoặc là unbuffer python log.py > command.log

Thêm thông tin: Làm thế nào tôi có thể lưu đầu ra lệnh vào một tệp trong thời gian thực?


0
2017-07-04 20:54



Họ làm lưu đầu ra khi họ nhận được nó, vấn đề là python bật đệm khi đầu ra không phải là một TTY. Các tùy chọn khác để vô hiệu hóa điều này trong Python: stackoverflow.com/q/107705/2072269 - muru