Khôi phục đầu ra cho thiết bị đầu cuối sau khi đã phát hành exec exec &> tên tệp


15

Tôi đang cố gắng thực hiện như sau:

exec &>filename

Sau này tôi không thể thấy bất cứ thứ gì kể cả những gì tôi đã gõ, được rồi.

Tôi điên cuồng cố gắng, exec 1>&1exec 2>&2, nhưng không có gì xảy ra.

Bây giờ, không giết chết shell, làm thế nào để tôi lấy lại đầu ra được chuyển hướng đến thiết bị xuất chuẩn và lỗi được chuyển hướng đến thiết bị lỗi chuẩn tương ứng? Các mô tả tập tin có phải là cách duy nhất để giới thiệu tiêu chuẩn [in | out] put và stderr không?


1
Hmm ... tại sao bạn chuyển hướng stderr / stdout của shell tương tác của bạn sau đó? Đây execxây dựng thường được sử dụng trong kịch bản chạy trong một subshell, để chuyển hướng đầu ra ví dụ họ vào một tập tin. Tôi không thấy việc sử dụng nó trong một phiên tương tác.
Martin von Wittich

3
@MartinvonWittich Tôi đồng ý với tuyên bố về exec. Tôi đồng ý. Tôi chỉ là một đứa trẻ chơi xung quanh :)
user917279

Câu trả lời:


23

Sau khi bạn chạy exec &>filename, đầu ra tiêu chuẩn và lỗi tiêu chuẩn của shell chuyển sang filename. Đầu vào tiêu chuẩn là mô tả tệp 0 theo định nghĩa và đầu ra tiêu chuẩn là fd 1 và lỗi tiêu chuẩn là fd 2.

Một bộ mô tả tệp không được chuyển hướng hoặc không được chuyển hướng: nó luôn đi đâu đó (giả sử rằng quy trình này đã mở bộ mô tả này). Để chuyển hướng một mô tả tập tin có nghĩa là thay đổi nơi nó đi. Khi bạn chạy exec &>filename, thiết bị xuất chuẩn và thiết bị xuất chuẩn trước đây được kết nối với thiết bị đầu cuối và được kết nối với filename.

Luôn có một cách để tham khảo thiết bị đầu cuối hiện tại : /dev/tty. Khi một tiến trình mở tệp này, nó luôn có nghĩa là thiết bị đầu cuối kiểm soát của quá trình , bất kể đó là gì. Vì vậy, nếu bạn muốn lấy lại thiết bị xuất chuẩn và thiết bị xuất chuẩn ban đầu của shell đó, bạn có thể làm điều đó vì tệp mà chúng được kết nối vẫn còn xung quanh.

exec &>/dev/tty

1
như @Joseph R. đã trả lời $ (tty) cho tôi thấy / dev / pty0, nhưng lệnh của bạn quá hiệu quả, cái nào dễ di chuyển hơn trên các hương vị Unix? cảm ơn bạn đã trả lời rõ ràng hơn
user917279

2
@ user917279 Chúng di động như nhau theo nghĩa làm việc trên các hương vị unix khác nhau. /dev/ttyhoạt động trong trường hợp $(tty)không: /dev/ttyhoạt động miễn là quá trình có thiết bị đầu cuối điều khiển (đó là điều tốt nhất bạn có thể hy vọng, vì phải có một cái gì đó vẫn kết nối quy trình với thiết bị đầu cuối), trong khi $(tty)yêu cầu thiết bị đầu cuối vẫn được mở trên đầu vào tiêu chuẩn.
Gilles 'SO- ngừng trở nên xấu xa'

11

Bạn muốn

exec &>$(tty)

Những gì bạn đang làm trong câu hỏi của bạn là sao chép trong thiết bị xuất chuẩn và thiết bị xuất chuẩn và thiết bị xuất chuẩn ban đầu đã được chuyển hướng đến tệp.

Như câu trả lời của Gilles giải thích, ttysẽ trả về thiết bị đầu cuối của thiết bị đầu cuối hiện tại. Đây là nơi mà ba mô tả tập tin tiêu chuẩn đến từ / đi đến theo mặc định trong một vỏ đăng nhập. Vì vậy, tuyên bố trên sử dụng ttyđể chuyển hướng thiết bị xuất chuẩn và thiết bị xuất chuẩn trở lại thiết bị đầu cuối như trước đây.

Nếu bạn lo lắng về tính di động (theo nhận xét của bạn về câu trả lời của Gilles), cả hai phương pháp ( tiện ích tty/dev/ttytệp ) đều nằm trong tiêu chuẩn POSIX.

Sao chép nguyên văn từ bình luận của Gilles:

There's an advantage to /dev/tty: it works even after exec <somefile, 
whereas $(tty) would complain “not a tty”

nó hoạt động Cảm ơn bạn. echo $ (tty) give / dev / pty0 (trong cygwin), nó liên quan đến stdin, stdout như thế nào và điều gì xảy ra với câu lệnh trên? xin vui lòng cho tôi biết nếu tôi cần phải hỏi điều này như một câu hỏi riêng biệt.
user917279

@ user917279 Trả lời cập nhật.
Joseph R.

Cảm ơn Joseph. Tôi đã đăng câu hỏi này trước khi xem câu trả lời của Giles. Cảm ơn rât nhiều. Xin cho phép tôi đánh dấu câu trả lời của Giles là được chấp nhận, vì nó làm cho ngay cả những bộ óc ngu ngốc như tôi hiểu đúng.
dùng917279

2
Có một lợi thế để /dev/tty: nó hoạt động ngay cả sau exec <somefileđó, trong khi đó $(tty)sẽ phàn nàn rằng không phải là một tty.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles Cảm ơn bạn đã nhận xét đặc biệt khai sáng :)
Joseph R.
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.