actualización
Esto se puede hacer. Vea la respuesta de kaluy de la manera más simple.
respuesta original
Parece que la respuesta es "no se puede". Los descriptores creados en un script no se aplican al shell que invocó el script.
Descubrí cómo hacerlo usando ruby, si alguien está interesado. Ver también la actualización usando 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"
Tenga en cuenta que esto obviamente no funcionará en un demonio - no está conectado a un terminal.
ACTUALIZACIÓN
Si Ruby no es lo suyo, sólo tiene que llamar a una escritura del golpe del guión rubí. Necesitará el Open4 gema/biblioteca para tuberías fiable de salida:
require 'open4'
# ... insert begin/rescue/end block from above
Open4.spawn('./out.sh', :out => out)
ACTUALIZACIÓN 2
Aquí está una manera con un poco de Perl y sobre todo bash. Debe asegurarse de que Perl funcione correctamente en su sistema, ya que un ejecutable Perl que falta también devolverá un código de salida distinto de cero.
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
Un sitio útil [link] (http://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/x13082.html) – Mike
Usted puede ser capaz de utilizar una [nombre de tubería] (http: // Linux. die.net/man/1/mkfifo). –