En bash.
¿Tengo dificultades para determinar qué debo usar?
todos mis scripts usan ">> / dev / stderr"
en bash prompt, si lo intento:
echo test >>/dev/stderr
funciona
echo test >> /dev/stderr
funciona
echo test >/dev/stderr
funciona
echo test > /dev/stderr
funciona
echo test >>&2
FALLAS!
echo test >> &2
FALLAS!
echo test >&2
funciona
echo test > &2
falla!
Estoy dispuesto a cambiar todos mis scripts a >&2
.
Parece que también tiene un gran efecto sobre ssh (after su SomeUser
) donde >>/dev/stderr
no funcionará en absoluto (permiso denegado), solo >&2
funcionará.
bash
ssh
io-redirection
stderr
Poder de acuario
fuente
fuente
su
que sucede el problema, actualicé la preguntasu -c 'some command'
, ese comando se ejecuta/bin/sh
, nobash
, por/dev/stderr
lo que no se garantiza que haya un comportamiento específico de bash (como simular con fines de redireccionamiento cuando no está disponible).Respuestas:
>& n
es la sintaxis de shell para duplicar directamente un descriptor de archivo . El descriptor de archivo 2 es stderr; así es como funciona. También puede duplicar otros descriptores de archivos, no solo stderr. No puede usar el modo de agregar aquí porque duplicar un descriptor de archivo nunca se trunca (incluso si su stderr es un archivo) y>&
es un token, por eso no puede poner un espacio dentro de él, pero>& 2
funciona.>> name
es una sintaxis permitida diferente, dondename
es un nombre de archivo (y el token es>>
). En este caso, está utilizando el nombre del archivo/dev/stderr
, que mediante el manejo específico del sistema operativo (en Linux, es un enlace simbólico/proc/self/fd/2
) también significa error estándar. El modo Agregar y truncar terminan haciendo lo mismo cuando stderr es una terminal porque eso no se puede truncar. Si el error estándar es un archivo, sin embargo, se puede truncar:Si ve un error con
/dev/stderr
más de ssh, es posible que el administrador del servidor haya aplicado alguna medida de seguridad para evitar que ese enlace simbólico funcione. (Por ejemplo, no puedes acceder/proc
o/dev
). Si bien esperaría que causara todo tipo de roturas extrañas, usar la sintaxis de descriptor de archivo duplicado es un enfoque perfectamente razonable (y probablemente un poco más eficiente). Personalmente lo prefiero.fuente
>>
, ¡gracias por señalarlo! Además, me perdí un pasosu SomeUser
después de conectarme a través de ssh.bash -c 'echo hi >&2; echo bye >&2' 2>/tmp/foo;cat /tmp/foo
no se truncará aunque! (incluso con2>&1 |tee /tmp/foo
) lo que es perfecto para iniciar sesión, y funcionará perfectamente después de que lo cambie todo>&2
. Así que supongo que solo un uso directo del archivo/dev/stderr
permite truncar, no el descriptor duplicado, ¡genial!Los casos de falla ocurren porque la sintaxis bash para usar
&
en redirecciones especifica una sola>
y requiere que exista directamente adyacente al&
signo:fuente
Use
'>'
para redirigir (trunca si existe) o'>>'
(agrega si existe)Úselo
'>&'
para duplicar una secuencia, por ejemplo, si desea una salida estándar Y un error estándar en el mismo archivo, redirige a un archivo'> output.log'
y también error con'2>&'
fuente