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 stderr
sử 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 stderr
và đầ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 2
trên)
make
lệ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 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ế, 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>&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 sang STDERR.
sh: 1: Syntax error: "&" unexpected
khi tôi sử dụng |& tee
từ 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 $SHELL
hiển thị /bin/bash
và $SHELL --version
hiển thị phiên bản 4.3.11 (1). Tôi đã thử #!/bin/bash
trong 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 sh
và bash
trên máy chủ của mình. Cảm ơn.
sh
và không bash
(hoặc có thể bash
ở sh
chế độ ...). 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 $SHELL
nó 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
tee
là 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
ls
và 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 cron
công việc, vv bạn muốn tránh các phần mở rộng Bash. Các sh
toá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.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ả sử log.py
có 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.log
hoặ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.txt
vàsomeCommand 2>> someFile.txt
cũng chuyển hướngstterr
đến someFile.txt