Скрипт зависает при использовании tee and wait, почему?

Su código tiene dos errores :El operador !=necesita espacios a su alrededor, y el &&debe estar entre pruebas individuales [... ].

En lugar de usar muchas pruebas individuales:

for (( x = 7; x <= 65; x += 2 )); do
    case $x in
        29|53|57|59) ;;
        *)
            cp -f ~aman/user_ana_normal_mode/Testforaman/user_ana.so "charged_$x"
    esac
done

También he quitado la mitad inútil cd.

1
16.07.2019, 17:05
1 ответ

teeвнутри подстановки процесса не завершится, пока он не получит eof на свой стандартный ввод или не произойдет какая-либо ошибка.

И, поскольку его стандартный ввод является каналом, он получит EOFна своем стандартном вводе только тогда, когда все дескрипторы его конца записи будут закрыты.

Итак, вам придется сохранить исходные stdout и stderr, а затем перед waitперенаправить их на исходники; Дублирование fd через new>&oldприводит к закрытию oldfd.

exec {out}>&1 {err}>&2
exec > >(tee -a output) 2>&1
...
exec >&$out 2>&$err
wait $(pgrep -P "$$")

Кроме того, только в более новых версиях bash waitтакже ожидает процессов, запущенных в > >(...)подстановке процессов; поэтому я использовал wait $(pgrep -P "$$")вместо простогоwait(pgrep -Pпоиска процессов по их родителю ). Также см. здесь для этой и других ловушек, связанных с > >(...).

4
27.01.2020, 23:17

Теги

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