Вывод команды насоса как аргумент функции

Я понимаю, что это не совсем отвечает на вопрос с хорошей точки зрения, но было бы более полезно полностью остановить неиспользуемые программы, приостановив их? Судя по вашему описанию, программы интерактивные, а не пакетные процессы и т.д., и нет необходимости в том, чтобы они потребляли какие-либо ресурсы, если они не используются.

Вы можете использовать:

kill -STOP

и возобновить снова с помощью:

kill -CONT

Если программа запущена в терминале shell ctrl-Z приостанавливает программу, и fg (foreground) плюс номер задания, возобновляет.

1
29.05.2018, 19:53
2 ответа

Absolutamente ninguna salida es simple, solo redirija el script stdouty stderra/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 execpara configurar las redirecciones.

0
28.01.2020, 00:34

En primer lugar, esa función solo registrará la primera "palabra" de todo lo que se le envíe, ya que usa $1en 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
0
28.01.2020, 00:34

Теги

Похожие вопросы