Red de conocimiento informático - Material del sitio web - Cómo capturar la salida de un comando de C# Shell

Cómo capturar la salida de un comando de C# Shell

El método introducido principalmente es obtener el contenido de salida del comando, en lugar del valor de retorno de si la ejecución del comando fue exitosa o no.

Normalmente, en un script de shell, es necesario obtener el contenido de salida del comando y luego determinar la siguiente operación de ejecución en función del contenido de salida.

Uno de los métodos más utilizados es hacer coincidir si hay ciertas palabras clave en el contenido generado por el comando y seleccionar diferentes acciones para realizar.

Un método más utilizado es utilizar comillas simples inversas: el nombre de la variable para guardar el resultado = `comando de Linux a ejecutar`

Al utilizar este método, hay algunos detalles que necesitan atención. Usemos algunos ejemplos para ilustrar.

Por ejemplo, en el entorno CentOS7, utilice el comando rpm -qa para comprobar si ciertos paquetes rpm están instalados. Si no, instálelos.

Un ejemplo sencillo:

#!/bin/bash

check_results=`rpm -qa | grep "zlib"`

echo "los resultados del comando(rpm -qa) son: $check_results"

if [[ $check_results =~ "zlib" ]]

entonces

echo " El paquete zlib ya está instalado. "

else

echo "Esto instalará el paquete zlib"

fi

Guardar como prueba. .sh y luego ejecute

$bash test.sh

Los resultados son:

command(rpm -qa) los resultados son: zlib- 1.2. 7-13.el7.x86_64

El paquete zlib ya está instalado.

Este script básicamente funciona.

Luego, también utilizamos un método similar para verificar si el paquete de software del iniciador iscsi está instalado. A diferencia del comando anterior, no se puede obtener si este comando está instalado mediante el comando rpm -qa.

Adoptamos otro enfoque

#!/bin/bash

check_results=`iscsiadm --version | grep iscsiadm`

echo "check command(iscsiadm) los resultados disponibles son: $check_results"

if [[ $check_results =~ "iscsiadm" ]]

entonces

echo "command iscsiadm ya se puede usar."

else

echo "el comando iscsiadm no se puede usar para instalarlo"

rpm -ivh iscsi-initiator -utils. -6.2.0.873-29.el7.x86_64.rpm

fi

El resultado de la ejecución es:

$ bash test.sh

los resultados disponibles de verificación del comando (iscsiadm) son: iscsiadm versión 6.2.0.873-28

El comando iscsiadm ya se pudo usar.

En este momento parece que el script está funcionando normalmente. Muestra que iscsiadm está disponible. ¿Y qué pasa si el comando iscsiadm no está disponible al principio?

Podemos cambiar el check_results=`iscsiadm --version | grep iscsiadm` por check_results=`iscsiadmm --version` | p>

De esta manera, escribimos deliberadamente el comando incorrecto para simular la ejecución del script cuando el comando no está instalado.

El resultado de la ejecución después de la reparación es el siguiente

$ bash test.sh

test.sh: línea 2: iscsiadmm: comando no encontrado

Los resultados disponibles del comando check(iscsiadm) son:

El comando iscsiadm no se puede usar. Instálelo

Parece estar funcionando normalmente, pero ¿por qué el contenido de check_results? ¿vacío? ¿No debería asignarse el contenido del "comando no encontrado: iscsiadmm" a check_results y luego imprimirse y mostrarse?

Ejecutaremos iscsiadmm --version | grep iscsiadm solo en la línea de comando, y habrá salida. ¿Por qué la tarea no puede realizarse correctamente?

En este momento, si ejecutamos el comando echo$? después de ejecutar el comando, el valor obtenido en este momento es 127 (sistema Centos7). Después de ejecutar el comando scsiadm --version | grep iscsiadm por separado en la línea de comando, el valor obtenido al ejecutar echo $? es 0 (sistema Centos7)

Se puede ver desde aquí que al usar... (2 reverso Al obtener resultados de ejecución utilizando comillas simples), debe asegurarse de que el comando entre comillas simples se pueda ejecutar correctamente.

Incluso de esta manera, ¿podemos garantizar que podremos obtener el contenido que queremos? No necesariamente, veamos un ejemplo.

#!/bin/bash

check_results=`java -version`

echo "comprobar que los resultados de la versión de Java son: $check_results"

if [[ $check_results =~ "1.8." ]]

entonces

echo "la versión de Java es 1.8, parece que no es necesario instalar Java nuevamente".

else

echo "Se va a instalar la versión jdk 1.8"

fi

El resultado de la ejecución es:

$ bash test.sh

versión de Java "1.8.0_73"

Java(TM) SE Runtime Environment (compilación 1.8.0_73-b02)

Java HotSpot (TM) VM de servidor de 64 bits (compilación 25.73-b02, modo mixto)

Los resultados de la verificación de la versión de Java son:

Se instalará la versión jdk 1.8

¿Qué está pasando? El comando jdk ha sido instalado, ¿por qué todavía no coincide? Según el segundo ejemplo, ejecutamos manualmente el comando java -version y luego ejecutamos el comando $? El resultado es 0, lo que indica que el comando se ejecutó correctamente. ¿Por qué todavía no obtengo el resultado del comando?

La razón de este fenómeno es que el resultado de la ejecución del comando puede ser redirigido.

Intente cambiar check_results=`java -version` a check_results=`java -version 1gt; /dev/stdout` y check_results=`java -version 2gt; Hay cambios

Para evitar que esto suceda, finalmente cambiamos lo anterior a check_results=`java -version 2gt;amp;1` y obtuvimos el resultado deseado.

Cuando se usa el nombre de la variable para guardar el resultado = `comando de Linux a ejecutar` para obtener el resultado del comando, los aspectos a los que se debe prestar atención se resumen a continuación:

1) Asegúrese de que el comando interno no se ejecute correctamente, es decir, la salida de $ después de ejecutar el comando debe ser 0; de lo contrario, no se puede obtener la salida del comando

2) Incluso si el valor de retorno del comando es 0, debe asegurarse. El resultado se genera a través de la salida estándar, no de la salida de error estándar; de lo contrario, debe redirigirse

Por lo tanto, recomendamos usar el nombre de la variable para guardar. el resultado = `comando de Linux que se ejecutará 2gt;amp;1` para obtener los resultados de la ejecución del comando.

Los amigos interesados ​​pueden probar los resultados de cambiar check_results=`iscsiadmm --version 2gt;amp;1` en el segundo ejemplo.