Cập nhật
Điều này có thể được thực hiện. Xem câu trả lời của kaluy cho cách đơn giản nhất.
gốc trả lời
Dường như câu trả lời là "bạn không thể". Bất kỳ bộ mô tả nào được tạo trong tập lệnh đều không áp dụng cho trình bao gọi là tập lệnh.
Tôi đã tìm ra cách sử dụng nó bằng ruby, nếu có ai quan tâm. Xem thêm bản cập nhật sử dụng perl.
begin
out = IO.new(3, 'w')
rescue Errno::EBADF, ArgumentError
out = File.open('/dev/tty', 'w')
end
p out.fileno
out.puts "hello world"
Lưu ý rằng điều này rõ ràng sẽ không hoạt động trong daemon - không được kết nối với thiết bị đầu cuối.
CẬP NHẬT
Nếu ruby không phải là điều của bạn, bạn có thể chỉ cần gọi tập lệnh bash từ tập lệnh ruby. Bạn sẽ cần viên ngọc Open4/thư viện cho đường ống đáng tin cậy của kết quả:
require 'open4'
# ... insert begin/rescue/end block from above
Open4.spawn('./out.sh', :out => out)
UPDATE 2
Đây là một cách sử dụng một chút perl và hầu hết là bash. Bạn phải chắc chắn rằng perl đang hoạt động đúng trên hệ thống của bạn, bởi vì một thực thi perl còn thiếu cũng sẽ trả về một mã thoát khác không.
perl -e 'open(TMPOUT, ">&3") or die' 2>/dev/null
if [[ $? != 0 ]]; then
echo "fd 3 wasn't open"
exec 3>/dev/tty
else
echo "fd 3 was open"
fi
echo foo1
echo foo2 >&2
echo foo3 >&3
Một trang web hữu ích [link] (http://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/x13082.html) – Mike
Bạn có thể có thể sử dụng một [tên ống] (http: // Linux. die.net/man/1/mkfifo). –