Làm thế nào để ngừng chuyển hướng trong bash


8

Tôi sử dụng :

exec >script.log 2>&1

trong tập lệnh của tôi để chuyển hướng tất cả đầu ra thành một tập tin. Ở phần cuối của kịch bản, tôi muốn in một thông báo ra màn hình. Làm thế nào để tôi dừng chuyển hướng?

Câu trả lời:


12

Bạn có thể gọi execlại để khôi phục lại các mô tả ban đầu. Bạn sẽ cần phải lưu chúng ở đâu đó.

exec 3>&1 4>&2 1>script.log 2>&1
 logged portion 
exec 1>&3 2>&4
echo >&2 "Done"

Trong phần ghi nhật ký, bạn có thể sử dụng các bộ mô tả gốc cho một lệnh bằng cách chuyển hướng đến các bộ mô tả bổ sung.

echo "30 seconds remaining" >&3

Ngoài ra, bạn có thể đặt phần đã ghi của tập lệnh vào một lệnh ghép và chuyển hướng lệnh ghép đó. Điều này không hoạt động nếu bạn muốn sử dụng các mô tả ban đầu trong một cái bẫy ở đâu đó trong phần được chuyển hướng đó.

{
 logged portion 
} >script.log 2>&1
echo >&2 "Done"

Nhận xét về tiếng vang để >&3làm cho giải pháp ưa thích của tôi. Cảm ơn (một lần nữa)!
Willem

6

Sử dụng additinal fd 3 và 4 cho stdout và stderr và chỉ cần chuyển hướng 1 và 2 cho chúng ở cuối tập lệnh của bạn:

exec 3>&1 4>&2
exec >script.log 2>&1

echo "Some code"

exec >&3 2>&4
echo "Done"

Điều này trả về một lỗi:exec 3>/dev/stdout 4>/dev/stderr -bash: /dev/stdout: Permission denied
Willem

Lỗi này có thể xảy ra khi bạn đang cố khởi chạy tập lệnh của mình trong một người dùng khác. Bạn có sử dụng kịch bản của bạn thông qua sudo?
vội vàng

Vâng, đó là: Tôi đã làm một tài khoản cho một tài khoản khác và chạy mã. Kịch bản tôi đang viết sẽ được chạy qua sudo, vì vậy tôi sẽ gặp vấn đề tương tự ở đó. Có một sự thay thế?
Willem

Tôi tin rằng có một số giải pháp tinh vi, tiếc là tôi biết tùy chọn duy nhất, có thể hoàn toàn không được chấp nhận từ quan điểm bảo mật: thêm người dùng mục tiêu của bạn vào nhóm chính người dùng ban đầu của bạn và thêm quyền ghi nhóm cho / Proc / self / fd / 1 trước khi ra mắt kịch bản. (hoặc thậm chí dễ bị tổn thương hơn - chỉ cần tạo quyền viết tạm thời cho tất cả và xóa nó ngay sau khi tập lệnh kết thúc mà không thay đổi nhóm).
vội vàng

1
@Willem Điều này dễ dàng được khắc phục bằng cách sử dụng các mô tả tệp thay vì mở lại các tệp, xem chỉnh sửa của tôi.
Gilles 'SO- ngừng trở nên xấu xa'

1

Trước tiên, bạn nên kiểm tra xem bạn có tty hay không.

if tty -s; then
    echo "Hello, World" > $(tty)
fi

1
Lưu ý rằng cách này không thể cung cấp đầu ra cho chương trình bên ngoài.
vội vàng

Không cần thiết phải sử dụng ttytiện ích bên ngoài . Bạn có thể chuyển hướng đến thiết bị đặc biệt /dev/tty.
Tạm dừng cho đến khi có thông báo mới.
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.