Ocultar el resultado de un comando de shell generalmente implica redirigir stderr y stdout. ¿Hay alguna instalación o comando incorporado que, de forma predeterminada, oculta la salida pero, por error, voltea toda la salida acumulada? Me gustaría ejecutar esto como un contenedor para ssh
comandos remotos . Ahora los tengo usando la redirección, pero no tengo ni idea de qué los hizo fallar, y son demasiado detallados.
EDITAR: Al final, creé la siguiente plantilla basada en la respuesta de @Belmin que modifiqué un poco para acumular todos los comandos anteriores del script, usar el identificador de proceso actual, eliminar automáticamente el registro y agregar un error rojo de falla mensaje cuando algo sale mal. En esta plantilla, los silent
contenedores iniciales tendrán éxito, luego fallarán el tercer comando porque el directorio ya existe:
#!/bin/sh
set -e
SILENT_LOG=/tmp/silent_log_$$.txt
trap "/bin/rm -f $SILENT_LOG" EXIT
function report_and_exit {
cat "${SILENT_LOG}";
echo "\033[91mError running command.\033[39m"
exit 1;
}
function silent {
$* 2>>"${SILENT_LOG}" >> "${SILENT_LOG}" || report_and_exit;
}
silent mkdir -v pepe
silent mkdir -v pepe2
silent mkdir -v pepe
silent mkdir -v pepe2
2>&1
algo como:$* >>"${SILENT_LOG}" 2>&1" || report_and_exit
Respuestas:
Configuraría una función bash como esta:
Entonces, puedes ejecutar el comando:
fuente
/etc/passswd
algún otro archivo crítico y sobrescriba el contenido.$* > /tmp/surpress.out 2>&1
Esto realmente captura el stderr.$*
No es lo mejor manejar entradas arbitrarias. Especialmente cuando contiene espacios o banderas. La mayoría de los portátiles son de${1+"$@"}
acuerdo con stackoverflow.com/questions/743454/…Debería ser bastante fácil escribir un script para este propósito.
Algo así como este script completamente no probado.
Por otro lado, para los comandos que ejecuto como parte de un script, generalmente quiero algo mejor que simplemente imprimir toda la salida. A menudo limito lo que veo a lo desconocido. Aquí hay un guión que adapté de algo que leí hace más de una década.
fuente
No creo que haya una manera limpia de hacer esto, lo único que puedo pensar es
Sin embargo, implementar esto podría ser un proyecto interesante pero quizás más allá de las preguntas y respuestas.
fuente
quedando corto con algo como
tehcommand &>/tmp/$$ || cat /tmp/$$
depende de la facilidad de uso / escritura que desee / necesite. (por ejemplo, usarlo como una tubería o pasar el comando por argumento)
El script corto @zoredache es básicamente un prototipo para esto, lo que daría más solidez, manejaría la concurrencia, etc.
fuente
Inténtalo así:
fuente
out="$(command args...)" || echo "$out"