Đầu ra trực tiếp từ một lệnh đến một tệp bao gồm lệnh gốc, và in trong thiết bị đầu cuối


8

Khi chạy một số thử nghiệm, tôi cần chạy một loạt các lệnh. Nó sẽ cực kỳ hữu ích với tôi và giúp tôi tiết kiệm rất nhiều thời gian, nếu có một cách để làm tất cả những điều này:

  • Chạy lệnh tôi cần chạy
  • Chuyển hướng tất cả đầu ra từ lệnh sang một tệp đã chỉ định
  • Bao gồm lệnh gốc trong tệp được chỉ định
  • In đầu ra từ lệnh gốc trong thiết bị đầu cuối

Mọi người đã đề xuất sử dụng tee cho tôi, một công việc tuyệt vời là in ra thiết bị đầu cuối cũng như gửi đến một tệp nhưng không bao gồm lệnh gốc. Những gì tôi muốn kết thúc là một tệp trong đó dòng đầu tiên là lệnh tôi đã chạy, và bên dưới đó là đầu ra từ lệnh.

Có người đề nghị điều này:

echo "ls -l" | xargs -I{} bash -c "echo >> output.file; eval {} >> output.file"

Nhưng điều này không in đầu ra trong thiết bị đầu cuối hoặc bao gồm lệnh gốc trong tệp.

Tôi đánh giá cao bất kỳ ý tưởng.


2
Hầu như trùng lặp với Askubfox.com/q/688498/295286 .
Sergiy Kolodyazhnyy

Tôi đã không tìm thấy điều này trong tìm kiếm của mình - không hoàn toàn giống nhau, nhưng có lẽ sẽ dẫn tôi đến câu trả lời.
shaneoh

vâng, và đây là lý do tại sao tôi nói gần như trùng lặp. Nhưng để thành thật hoàn toàn với ý kiến ​​của tôi, bạn có thể sử dụng hầu hết mọi giải pháp từ đó và sử dụng nó với đường ống đến tee.
Sergiy Kolodyazhnyy

Câu trả lời:


14

Đó là teebạn đang tìm kiếm.

ls -l | tee outfile

in đầu ra của ls -lthiết bị xuất chuẩn (tức là thiết bị đầu cuối) và lưu nó vào tệp outfilecùng một lúc. Nhưng : Nó không ghi tên lệnh không xuất ra cũng như vào tệp. Để đạt được điều đó, chỉ cần echotên lệnh trước khi chạy lệnh và chuyển cả hai đầu ra sang tee:

( echo "ls -l" && ls -l ) | tee outfile

Đó là loại rườm rà để gõ, vậy tại sao không xác định hàm?

both(){ ( echo "$@" && "$@" ) | tee outfile ;}

Sau đó, bạn có thể chạy

both ls -l

để có được kết quả mong muốn. Đặt chức năng của bạn ~/.bashrcđể có nó được xác định trong mỗi thiết bị đầu cuối mới.

Nếu bạn muốn có thể chỉ định tệp đầu ra là đối số đầu tiên như trong

both output ls -l

thay vì làm cho nó:

both(){ ( echo "${@:2}" && "${@:2}" ) | tee "$1" ;}

Nếu bạn không muốn tập tin đầu ra bị ghi đè mà thay vào đó, hãy thêm -atùy chọn vào tee.


9

Bạn có thể sử dụng scriptlệnh sẽ tạo một tệp bản thảo của mọi thứ được in ra thiết bị đầu cuối của bạn. Nó tạo ra một vỏ nĩa và sẽ ghi lại mọi thứ cho đến khi vỏ đó được thoát ra.

$ script my_output
Script started on Tue 28 Nov 2017 09:46:15 AM UTC
$ whoami
ajefferiss
$ exit
Script done on Tue 28 Nov 2017 09:46:27 AM UTC

Sau đó, nếu tôi cat my_outputnhận được cùng một đầu ra:

$ cat my_output
Script started on Tue 28 Nov 2017 09:46:15 AM UTC
$ whoami
ajefferiss
$ exit
exit

Script done on Tue 28 Nov 2017 09:46:27 AM UTC

6

Bạn có thể sử dụng chức năng gỡ lỗi của shell cùng với tee:

( set -x; command1 args...; command2 args ) 2>&1 | tee output.log
  • ( ... )bắt đầu một lớp vỏ phụ cho phép bạn thu thập các luồng đầu ra của tất cả các lệnh được thực thi trong lớp vỏ phụ. Nó cũng chứa tác dụng của setlệnh bên dưới với lớp vỏ phụ này.

  • set -xcho phép xtùy chọn shell in tất cả các lệnh mà shell chạy đến luồng lỗi tiêu chuẩn trước khi chạy chúng.

  • 2>&1 chuyển hướng luồng 2 (lỗi tiêu chuẩn) sang luồng 1 (đầu ra tiêu chuẩn).

  • | chuyển hướng luồng đầu ra tiêu chuẩn của lệnh trái sang luồng đầu vào tiêu chuẩn của lệnh phải.

  • tee FILEsao chép luồng đầu vào tiêu chuẩn vào tập tin FILEvà đầu ra tiêu chuẩn.

Nếu chuỗi lệnh của bạn đã có trong tệp tập lệnh, sẽ có ý nghĩa hơn khi chạy nó như thế này:

bash -x /path/to/script args... 2>&1 | tee output.log
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.