Я понимаю, что это не совсем отвечает на вопрос с хорошей
точки зрения, но было бы более полезно полностью остановить неиспользуемые программы, приостановив их? Судя по вашему описанию, программы интерактивные, а не пакетные процессы и т.д., и нет необходимости в том, чтобы они потребляли какие-либо ресурсы, если они не используются.
Вы можете использовать:
kill -STOP
и возобновить снова с помощью:
kill -CONT
Если программа запущена в терминале shell ctrl-Z
приостанавливает программу, и fg
(foreground) плюс номер задания, возобновляет.
Absolutamente ninguna salida es simple, solo redirija el script stdout
y stderr
a/dev/null
:
exec >/dev/null 2>&1
Eso afectará al propio shell y a cualquier comando que ejecute después. Ejecute eso condicionalmente para elegir dónde se redirige la salida.
if [ "$output_to_file" = 1 ]; then
exec > "$outputfilename" 2>&1
elif [ "$output_suppress" = 1 ]; then
exec > /dev/null 2>&1
fi
Tenga en cuenta que suprimir toda la salida probablemente no sea una buena idea. Es muy probable que el usuario quiera alguna notificación de errores.
Si insiste en pasar la salida a través de la función (y está ejecutando Bash/ksh/Zsh ), podría usar la sustitución de procesos:
#!/bin/bash
mangle_output() {
# do something smarter here
while read -r line; do
echo "output: $line";
done;
}
# redirect stdout and stderr to the function
exec > >(mangle_output) 2>&1
echo something that produces output
Aunque tenga en cuenta que procesar la salida con un bucle de shell no es una muy buena idea, al menos es lento. Consulte:¿Por qué se considera una mala práctica usar un bucle de shell para procesar texto? . Si todo lo que desea es redirigir un archivo, o /dev/null
, simplemente use exec
para configurar las redirecciones.
En primer lugar, esa función solo registrará la primera "palabra" de todo lo que se le envíe, ya que usa $1
en lugar de "$*"
.
En segundo lugar, hay (como suele ser el caso con POSIX )innumerables maneras de hacer este tipo de cosas. Probablemente iría con algo como:
log() {
cat - >> "$logfile"
}
do_stuff | log
Pero también podrías:
(
do_stuff
do_more_stuff
) >> "$logfile"
En cuanto a la supresión completa de todos los resultados --, es mejor dejarlo para el entorno de invocación (e. gramo../thing 1> /dev/null 2> &1
)en lugar de bloquearlo "en código", por así decirlo. Dicho esto:
squashout="true" # comment this out to stop killing output
if ! [[ "true" = "${squashout-false}" ]]; then
# Redirect stdout and stderr to the null device.
exec 1> /dev/null
exec 2> /dev/null
fi