solucionado not found bash shell exec

solucionado - command not found bash



comando sh: exec 2> & 1 (5)

Al igual que @cma dijo, pone stderr en stdout. La razón por la que puede querer este comportamiento es usar grep o cualquier otra utilidad para capturar resultados que solo aparecen en stderr. O quizás desee guardar todos los resultados, incluido stderr, en un archivo para su posterior procesamiento.

¿Qué hará este comando?

exec 2>&1


Ata el error estándar a la salida estándar

el 2 es stderr y 1 es stdout. Cuando ejecutas un programa, obtienes la salida normal en stdout, pero cualquier error o advertencia suele ir a stderr. Si desea canalizar toda la salida a un archivo, por ejemplo, es útil primero combinar stderr con stdout con 2>&1 .


Técnicamente hablando, duplica, o copia, stderr en stdout.

Por lo general, no necesita el ejecutivo para realizar esto. Un uso más típico de exec con descriptores de archivos es indicar que desea asignar un archivo a un descriptor de archivo no utilizado, por ejemplo

exec 35< my_input

Por cierto, no olvide que la secuencia de declaración cuando se conecta a un archivo es importante, por lo que

ls > mydirlist 2>&1

funcionará porque dirige stdout y stderr al archivo mydirlist, mientras que el comando

ls 2>&1 > mydirlist

dirige solo stdout, y no stderr, para archivar mydirlist, porque stderr se convirtió en una copia de stdout antes de que stdout fuera redirigido a mydirlist.

Editar: Es la forma en que el caparazón funciona escaneando de izquierda a derecha. Así que lea el segundo diciendo "copiar stderr en stdout" antes de que diga "enviar stdout a mydirlist". Luego lea el primero como diciendo "envíe la salida estándar al archivo mydirlist" antes de que diga "stderr duplicado en esa salida estándar que configuré". Lo sé. ¡No es totalmente intuitivo!


Una aplicación bastante útil de exec 2>&1 que me he encontrado es cuando desea fusionar stderr y stdout para varios comandos separados por punto y coma. Mi ejemplo particular sucedió cuando estaba enviando más de un comando para popen en PHP y quería ver los errores intercalados como lo vería si escribiera los comandos en el indicador de shell:

$ echo hi ; yikes ; echo there hi -bash: yikes: command not found there $

Lo siguiente no fusiona stderr y stdout excepción del último echo (que no tiene sentido porque el yikes provoca el error):

echo hi ; yikes ; echo there 2>&1

Puedo obtener la salida combinada de la "manera difícil" de la siguiente manera:

echo hi 2>&1; yikes 2>&1; echo there 2>&1

Se ve mucho más limpio y menos propenso a errores si usa exec :

exec 2>&1 ; echo hi; echo yikes; echo there

Obtendrá la salida stdout y stderr muy bien intercalada exactamente como lo vería en el terminal si ejecutara los tres comandos separados por un punto y coma.


Uno de los mejores artículos que he visto sobre lo que "2> & 1" hace es Bash One-Liners Explained, Parte III: Todo sobre las redirecciones .

Pero lo que las respuestas actuales sobre esta pregunta no proporcionan es por qué querría hacer esto después de un simple "ejecutivo". Como la página bash man para el comando exec explica: "Si no se especifica el comando, cualquier redirección tendrá efecto en el shell actual".

Escribí un script simple llamado out-and-err.py que escribe una línea de salida a stdout, y otra línea a stderr:

#!/usr/bin/python import sys sys.stdout.write(''this is stdout./n'') sys.stderr.write(''this is stderr./n'')

Y luego envolví eso en un script de shell llamado out-and-err.sh con un "ejecutivo 2> & 1":

#!/bin/bash exec 2>&1 ./out-and-err.py

Si solo ejecuto el script de python, stdout y stderr están separados:

$ ./out-and-err.py 1> out 2> err $ cat out this is stdout. $ cat err the is stderr.

Pero si ejecuto el script de shell, puede ver que el ejecutivo se encarga de stderr para todo después de:

$ ./out-and-err.sh 1> out 2> err $ cat out this is stdout. this is stderr. $ cat err $

Si el script de envoltura de shell hace mucho más que solo un comando de python, y necesita todos los resultados combinados en stdout, hacer el "exec 2> & 1" hará que sea más fácil para usted.