En bash.
¿Tengo dificultades para determinar qué debo usar?
todos mis scripts usan ">> / dev / stderr"
en bash prompt, si lo intento:
echo test >>/dev/stderrfunciona
echo test >> /dev/stderrfunciona
echo test >/dev/stderrfunciona
echo test > /dev/stderrfunciona
echo test >>&2FALLAS!
echo test >> &2FALLAS!
echo test >&2funciona
echo test > &2falla!
Estoy dispuesto a cambiar todos mis scripts a >&2.
Parece que también tiene un gran efecto sobre ssh (after su SomeUser) donde >>/dev/stderrno funcionará en absoluto (permiso denegado), solo >&2funcionará.
bash
ssh
io-redirection
stderr
Poder de acuario
fuente
fuente

suque sucede el problema, actualicé la preguntasu -c 'some command', ese comando se ejecuta/bin/sh, nobash, por/dev/stderrlo que no se garantiza que haya un comportamiento específico de bash (como simular con fines de redireccionamiento cuando no está disponible).Respuestas:
>& nes 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>& 2funciona.>> namees una sintaxis permitida diferente, dondenamees 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/stderrmá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/proco/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 SomeUserdespués de conectarme a través de ssh.bash -c 'echo hi >&2; echo bye >&2' 2>/tmp/foo;cat /tmp/foono 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/stderrpermite 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