Ejecute un comando si la entrada estándar está vacía

Ejecute un comando si la entrada estándar está vacía

Me gustaría hacer lo contrario xargs --no-run-if-empty, para que SÓLO se ejecute si la entrada estándar está vacía.

Uso de ejemplo:

ip a | fgrep "inet " | grep -ve " tun" -e " lo"
# pipe it into something and echo localhost if empty

Respuesta1

En este caso, grepdevuelve un código de error cuando no encuentra nada (no tiene resultados). Por lo tanto, no necesitamos mirar su salida estándar. En su lugar, podemos mirar el código de error. ||hará esto y solo ejecutará el siguiente comando, si el comando anterior falla.

ip a | fgrep "inet " | grep -ve " tun" -e " lo" || echo localhost

Respuesta2

El paquete moreutilsproporciona ifneuna herramienta. Normalmente ifneejecuta el comando dado si y solo si la entrada estándar esnovacío. Tiene, sin embargo, unaoperación inversamodo:

-n

Operación inversa. Ejecute el comando si la entrada estándar está vacía.

ifneTenga en cuenta que si la entrada estándar no está vacía, en este caso se pasa .

Úselo así:

ip a | fgrep "inet " | grep -ve " tun" -e " lo" | ifne -n echo "localhost"

Esto es lo que la diferencia de otras respuestas:

  • la solución no depende del estado de salida de ningún comando;
  • ifneno consume la transmisión si no está vacía (no está claro si esto es lo que quieres).

Una alternativa para texto es awk '{print} END {if (NR==0) print "localhost"}'. Para los datos que no son texto (en términos de POSIX: caracteres NUL, excedidos {LINE_MAX}, línea incompleta) awkes posible que no funcionen como desea.

Respuesta3

¿Has probado una condición simple como esta?

[[ -z $(ip a | fgrep "inet " | grep -ve " tun" -e " lo") ]] && echo localhost

información relacionada