アップデート
これを行うことができます。最も簡単な方法については、kaluyの回答を参照してください。
元の回答
答えは「できない」のようです。スクリプトで作成された記述子は、スクリプトを呼び出したシェルには適用されません。
誰かが興味を持っているなら、私はルビーを使ってそれを行う方法を理解しました。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"
これは明らかにデーモンでは機能しないことに注意してください-ターミナルに接続されていません。
アップデート
ルビーが気に入らない場合は、ルビースクリプトからbashスクリプトを呼び出すだけです。出力の信頼性の高い配管には、open4 gem/libraryが必要です。
require 'open4'
# ... insert begin/rescue/end block from above
Open4.spawn('./out.sh', :out => out)
更新2
これは、少しのperlとほとんどのbashを使用する方法です。欠落しているperl実行可能ファイルもゼロ以外の終了コードを返すため、perlがシステムで正しく機能していることを確認する必要があります。
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