Control de flujo stderr-stdout, operadores y procesos en segundo plano
5/8/20244 min read


$ whoami; ls - En este caso al ejecutar 2 comandos al mismo tiempo podemos utilizar el argumento ; , para poder separar el comando principal ( whoami ) del secundario ( ls ). Para ejecutar ambos comandos simultáneamente.


$ whoami && ls - En este caso podemos observar que el operador && nos sirve para decir ( Si el primer comando funciona, ejecuta el segundo. En el caso contrario si el primer comando no es exitoso, el segundo que no sea ejecutado) Como podemos observar en la imagen. Que como resultado nos da "not found"


$ whoami || ls - Como vemos en la imagen el operador que empleamos es || En el cual nos indica que si el primer comando es exitoso, que lo ejecute, sin ejecutar el segundo. Y si no lo es que ejecute el segundo. A diferencia del anterior &&.


Como podemos observar el primer comando sale erroneo. Pero al realizar la ejecucción del comando $echo $? Podemos observar que nos retorna el numero 127. Al ejecutar el segundo comando $cat /etc/sdds igualmente sale erroneo porque no existe. Y nuevamente ejecutando $echo $? Vemos que nos retorna el numero 1. Y para finalizar si ejecutamos el comando $whoami - Vemos que se ejecuta con exito y si volvemos a ejecutar $echo $? Nos retorna el valor 0.
Esto quiere decir que cada comando que ejecutemos de manera erronea nos retorna un valor superior a 0, en cambio si se ejecuta con exito nos lo retorna con el valor 0.
Y este error se define como STDERR


Volviendo a lo ultimo comentado, como vemos en pantalla, al ejecutar comandos de manera erronea nos retorna un texto conforme la ejecucción ha fallado. Este texto de error que vemos, a veces cuando estamos ejecutando un script o programa, deseamos que no se vea en pantalla o queremos el usuario final no los visualice. Y hay una manera de hacerlo.
$ whoam 2>/dev/null - Como vemos al ejecutar esta orden, el error desaparece. Esto se debe a que dentro del comando 2>/dev/null definimos el 2 como el error STDERR que vemos en pantalla, el operador > indica a donde queremos que se redirija dicho error. Y por ultimo indicamos que queremos que se vaya a /dev/null. Este archivo como tal /dev/null, es un archivo de a nivel de sistema, que es como un agujero negro de todo lo que queremos que desaparezca a nivel de archivo o comando. Por lo tanto $ whoam 2>/dev/null no retorna dicho error.


$ cat /etc/sddd > /dev/null 2>&1 - Como podemos comprobar en el primer comando nos referimos a /etc/sddd a un archivo inexistente, donde lo utilizamos de ejemplo a la hora de concatenar > /dev/null 2>&1. A la hora de realizar esto intento explicar que a parte de existir el STDERR existe el STDOUT, el STDOUT es el output que nos da la terminal a la hora de ejecutar el comando, puede ser abrirnos un archivo o mismamente decirnos que este directorio no existe.
Como vemos al hacer $cat /etc/hosts, nos da un STDOUT de lo que hay en el interior del archivo. Si luego aplicamos un $cat /etc/host > /dev/null y intentamos enviar el output all archivo null nos marcará el error aunque lo enviemos a /dev/null STDOUT, porque ese archivo no existe. Donde por ultimo si ejecutamos $cat /etc/host &>dev/null , vemos que nuevamente /etc/host no existe pero al aplicarle &>/dev/null en lugar de 2>/dev/null le estamos indicando que las STDERR y STDOUT nos las mande a null.
¿Y ESTO PARA QUE SIRVE?


$ wireshark - Como podemos observar al ejecutar wireshark desde terminal. Y al utilizar la aplicación, nos saltan errores STDERR y STDOUT. Si quisiéramos que no nos saltasen estos errores y poder operar con wireshark desde terminal, tenemos que entender que como proceso padre esta primeramente la terminal, y si nosotros cerrásemos la terminal, wireshark también se cerraría. Por lo tanto, es un poco molesto no poder seguir operando con la terminal.


$wireshark &>/dev/null - Como observamos con el comando &>/dev/null hacemos que desaparezca ese STDERR y STDOUT. Pero sigue siendo molesto porque no podemos seguir utilizando dicho terminal


$wireshark &>/dev/null & - Lo que logramos con este & final es hacer que el comando, es decir wireshark se ejecute en segundo plano pudiendo operar con la terminal sin ningún problema. Además veremos como resultado del comando un numero, que en este caso es el 57065. Que es su PID el numero identificativo del proceso que esta empleando wireshark y es único en el sistema, cada proceso tiene su propio PID.


$wireshark &>/dev/null & disown - Entonces lo dicho, si nosotros cerramos el terminal, el wireshark que es el proceso que estamos ejecutando, tambien se cerrará. Esto es debido a lo comentado anteriormente. El terminal es el proceso padre y el wireshark seria el proceso hijo. Para poder remediar esto, se ejecuta al final de la instrucción disown. Y vemos que como output nos retorna el numero de PID es decir de proceso. De manera que si cerramos el terminal, wireshark sigue ejecutandose.