Câu trả lời:
Có, có thể, chỉ cần chuyển hướng đầu ra thành một tệp:
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 cũng muốn stderrsử dụng điều này:
SomeCommand &> SomeFile.txt
hoặc cái này để nối thêm:
SomeCommand &>> SomeFile.txt
nếu bạn muốn có cả hai stderrvà đầu ra được hiển thị trên bàn điều khiển và trong một tệp, hãy sử dụng:
SomeCommand 2>&1 | tee SomeFile.txt
(Nếu bạn chỉ muốn đầu ra, bỏ phần 2trên)
makelệnh vào một tệp, nó yêu cầu cú pháp này thay vào đó: make > someFile.txt 2>&1(nguồn: linuxquestions.org/questions/linux-newbie-8/ trộm )
Để ghi đầ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.
Xin lưu ý rằng
n.e.trong cú pháp cột 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
command > output.txt
Luồng đầu ra tiêu chuẩn sẽ chỉ được chuyển hướng đến tệp, nó sẽ không hiển thị trong thiết bị đầu cuối. Nếu tập tin đã tồn tại, nó sẽ bị ghi đè.
command >> output.txt
Luồng đầu ra tiêu chuẩn sẽ chỉ được chuyển hướng đến tệp, 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 thêm vào cuối tệp.
command 2> output.txt
Luồng lỗi tiêu chuẩn sẽ chỉ được chuyển hướng đến tệp, nó sẽ không hiển thị trong thiết bị đầu cuối. Nếu tập tin đã tồn tại, nó sẽ bị ghi đè.
command 2>> output.txt
Luồng lỗi tiêu chuẩn sẽ chỉ được chuyển hướng đến tệp, 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 thêm vào cuối tệp.
command &> output.txt
Cả đầu ra tiêu chuẩn và luồng lỗi tiêu chuẩn sẽ chỉ được chuyển hướng đến tệp, không có gì hiển thị trong thiết bị đầu cuối. Nếu tập tin đã tồn tại, nó sẽ bị ghi đè.
command &>> output.txt
Cả đầu ra tiêu chuẩn và luồng lỗi tiêu chuẩn sẽ chỉ được chuyển hướng đến tệp, 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 tin, nó sẽ vẫn hiển thị trong thiết bị đầu cuối. Nếu tập tin đã 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 tin, 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 thêm vào cuối tệp.
(*)
Bash không có cú pháp tốc ký cho phép chỉ đưa StdErr vào lệnh thứ hai, điều này sẽ cần ở đây kết hợp với teemộ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ế, xin vui lòng xem "Làm thế nào để ống stderr, và không stdout?" trên Stack Overflow đối với một số cách làm thế nào điều này có thể được thực hiện, 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ả hai luồng đầu ra tiêu chuẩn và lỗi tiêu 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 tin đã tồn tại, nó sẽ bị ghi đè.
command |& tee -a output.txt
Cả hai luồng đầu ra tiêu chuẩn và lỗi tiêu 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 thêm vào cuối tệp.
2>&1chuyển hướng STDERR sang STDOUT, 1>&2chuyển hướng STDOUT sang STDERR và 3>&1sẽ chuyển hướng luồng 3 sang STDERR.
sh: 1: Syntax error: "&" unexpectedkhi tôi sử dụng |& teetừ tập lệnh Python trong máy chủ c9.io. Có vẻ như một vỏ khác đang được sử dụng. echo $SHELLhiển thị /bin/bashvà $SHELL --versionhiển thị phiên bản 4.3.11 (1). Tôi đã thử #!/bin/bashtrong kịch bản python của tôi nhưng tôi vẫn nhận được sh: 1: Syntax error. Tôi đã nhận được những gì tôi cần vì vậy tôi đang từ bỏ việc sắp xếp sự kỳ lạ giữa shvà bashtrên máy chủ của mình. Cảm ơn.
shvà không bash(hoặc có thể bashở shchế độ ...). Bạn có thể kiểm tra chính xác quá trình shell hiện tại của bạn đang sử dụng là gì ps -p $$ -o cmd=, bởi vì echo $SHELLnó không đáng tin cậy và sẽ hiển thị cho bạn shell đăng nhập của bạn, bỏ qua liệu bạn có thể đã bắt đầu một subshell khác hay không.
Bạn cũng có thể sử dụng teeđể gửi đầu ra tới một tệp:
command | tee ~/outputfile.txt
Một sửa đổi nhỏ cũng sẽ bắt được stderr:
command 2>&1 | tee ~/outputfile.txt
hoặc ngắn hơn một chút và ít phức tạp hơn:
command |& tee ~/outputfile.txt
teelà hữu ích nếu bạn muốn có thể chụp đầu ra lệnh trong khi xem nó trực tiếp .
2>&1?
Bạn có thể chuyển hướng đầu ra lệnh đến một tệp:
your_command >/path/to/file
Để nối đầu ra lệnh vào một tệp thay vì ghi đè lên nó, hãy sử dụng:
your_command >>/path/to/file
Một cải tiến để xem xét -
Các tập lệnh khác nhau sẽ đưa 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 sed để 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
lsvà grep, hỗ trợ --color=auto, chỉ xuất mã màu nếu đầu ra tiêu chuẩn là đầu cuối.
Đối với croncông việc, vv bạn muốn tránh các phần mở rộng Bash. Các shtoán tử chuyển hướng POSIX tương đươ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 theo một nghĩa nào đó đơn giản và đơn giản hơn. Các &>cú pháp được mượn từ cshđó nên đã thuyết phục bạn rằng đó là một ý tưởng tồi.
some_command | tee command.logvà some_command > command.logcó vấn đề là họ không lưu đầu ra lệnh vào command.logtệ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 expectgói.
Thí dụ:
sudo apt-get install expect
unbuffer some_command | tee command.log
unbuffer some_command > command.log
Giả sử log.pycó chứa:
import time
print('testing')
time.sleep(100) # sleeping for 100 seconds
bạn có thể chạy unbuffer python log.py | tee command.loghoặcunbuffer python log.py > command.log
Thông tin thêm: Làm cách nào tôi có thể lưu một đầu ra lệnh vào một tệp trong thời gian thực?
someCommand 2> someFile.txtvàsomeCommand 2>> someFile.txtcũng chuyển hướngstterrđến someFile.txt