¿Por qué hay un "2> &1"

  

en el shell de LINUX? A menudo es posible encontrar una llamada de comando del siguiente formulario en algunos scripts, especialmente al llamar a crontab

./t.sh > /dev /null 2 ​​> &1 La primera mitad de ./t.sh > /dev /null es fácil de entender, así que, ¿qué está pasando detrás de los 2 > &1?

Para explicar este problema, aún debe mencionar la redirección de archivos. Sabemos que > y < es una redirección de archivos. Entonces, ¿qué son 1 y 2? En el shell, cada proceso está asociado con tres archivos del sistema: entrada estándar de entrada, salida estándar y salida estándar de error. Los descriptores de archivo para los tres archivos de sistema son 0, 1 y 2, respectivamente. Así que aquí 2 > &1 significa que el error estándar también se envía a la salida estándar.

El siguiente es un ejemplo para mostrar qué efecto tiene 2 > &1:

1234 $ cat ./t.sh#!/usr/bin/zshttttttecho " prueba "

t.sh contiene dos comandos, donde tttttt es un comando que no existe y la ejecución informará un error. De forma predeterminada, el error se enviará a stderr. El eco puede ejecutarse correctamente y enviar la información de la cadena a la salida estándar. La salida estándar aquí se ha redirigido a /dev /null. Entonces, el error estándar también se enviará a /dev /null




¿Por qué 2 > &1 se debe escribir más adelante?

Primero, ./t.sh > /dev /null 2 ​​> &1 redirige la salida estándar a /dev /null, 2 > &1 es el error estándar que copia el comportamiento de salida estándar Es decir, también se redirige al archivo, el resultado final es que la salida estándar y los errores se redirigen al archivo. ./t.sh 2 > &1 > /dev /null El error estándar 2 > &1 copia el comportamiento de la salida estándar, pero la salida estándar aún se encuentra en el terminal. > /dev /null La salida se redirige a /dev /null, pero el error estándar aún no se cambiará a /dev /null


Los resultados de la prueba son los siguientes:

1234567891011121314 ➜ espacio de trabajo ./t.sh ./t.sh:2: comando no encontrado: ttttttest➜ espacio de trabajo ./t.sh > /dev/null./t.sh: 2: comando no encontrado: ttttt ➜ espacio de trabajo ./t.sh ./t.sh:2: comando no encontrado: espacio de trabajo ttttttest➜ ./t.sh > /dev/null./t.sh: 2: comando no encontrado: espacio de trabajo ttttt➜ ./T.sh > /dev /null 2 ​​> &1➜ espacio de trabajo ./t.sh 2 > &1 /dev/null./t.sh:2: comando no encontrado: ttttttest

Copyright © Conocimiento de Windows All Rights Reserved