Gửi bản sao đầu ra của tập lệnh tới một tệp


10

Giả sử tôi có tập lệnh Zsh và tôi muốn cho phép nó in ra STDOUT, nhưng cũng sao chép (kết xuất) kết xuất của nó vào một tệp trong đĩa.

Hơn nữa, kịch bản bắt đầu với tùy chọn sau

set -o xtrace

mà buộc nó phải dài dòng và in những lệnh nó chạy. Tôi muốn chụp đầu ra này cũng như trong một tập tin trong đĩa.

Sự hiểu biết của tôi là nếu tôi làm

./my_script.sh > log.txt

nó sẽ chỉ gửi STDOUTđến log.txt, nhưng nếu tôi muốn cũng có thể thấy đầu ra trong thiết bị đầu cuối thì sao?

Tôi đã đọc về teeMULTIOStùy chọn trong Zsh, nhưng không chắc chắn làm thế nào để sử dụng chúng.

Khi tôi làm:

./my_script | tee log.txt

Tôi có thể thấy đầu ra trên thiết bị đầu cuối, nhưng tập tin log.txtkhông thể chụp được mọi thứ (thực tế là nó chỉ chụp được bất cứ thứ gì).


./my_script.sh > log.txt 2>&1
mikeerv

Có vẻ như bạn đang tìm kiếm scriptlệnh. Hoặc có thểmyscript >&1 > log.txt 2>&1
Stéphane Chazelas

Câu trả lời:


12

Có thể là tập lệnh của bạn đang tạo đầu ra cho stdoutstderr, và bạn chỉ nhận được một trong những luồng đầu ra cho tệp nhật ký của mình.

./my_script.sh | tee log.txtthực sự sẽ xuất mọi thứ cho thiết bị đầu cuối, nhưng sẽ chỉ đổ stdoutvào logfile.

./my_script.sh > log.txt 2>&1 sẽ làm ngược lại, đổ mọi thứ vào tệp nhật ký, nhưng không hiển thị gì trên màn hình.

Bí quyết là kết hợp cả hai với tee:

./myscript.sh 2>&1 | tee log.txt

Điều này chuyển hướng stderr( 2) vào stdout( 1), sau đó dẫn stdoutvào tee, sao chép nó vào thiết bị đầu cuối vào tệp nhật ký.

Số zshlượng tương đương sẽ là:

./myscript.sh >&1 > log.txt 2>&1

Đó là, chuyển hướng thiết bị xuất chuẩn cả về thiết bị xuất chuẩn ban đầu và log.txt (bên trong thông qua một đường ống đến một cái gì đó hoạt động như thế tee), và sau đó chuyển hướng thiết bị xuất chuẩn sang đó (đến đường ống đến teequy trình giống như bên trong ).


Cảm ơn - Về dòng cuối cùng của bạn, tại sao không ./myscript.sh >&1 2>&1 > log.txt? (tức là chuyển đổi thứ tự của hai lần chuyển hướng cuối cùng). Sẽ có sự khác biệt giữa chúng?
Amelio Vazquez-Reina

Biến thể của bạn không xuất ra stdout, chỉ để log.txt. Dòng cuối cùng trong câu trả lời (được thêm bởi @ StéphaneChazelas chứ không phải bản thân tôi) cho cả hai.
savanto

0

nohup cho phép một công việc tiếp tục ngay cả khi giao diện điều khiển bị chết hoặc bị đóng, hữu ích cho các bản sao lưu dài, v.v., nhưng ở đây chúng tôi đang sử dụng ghi nhật ký tự động của nó.

nohup myscript.sh & ; tail -f nohup.out
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.