Сохранять перенаправление файлов между вызовами exec

Вот пример кода, демонстрирующий, как можно иметь несколько разделов «работы», обновляющих один и тот же индикатор выполнения. Датчик Whiptail прикреплен к файловому дескриптору сценария 3, поэтому его можно обновить в любой момент выполнения сценария. (Индикатор закрывается автоматически по завершении сценария или при явном закрытии FD 3.)

#!/bin/bash
#
pid=
tmpd=

tidyUp()
{
    # Clean up when we're done
    exec 3>&-
    [[ -n "$tmpd" ]] && rm -rf "$tmpd"
}
trap 'ss=$?; tidyUp; exit $ss' 1 2 15


updateGauge()
{
    local percent="$1" message="$2"
    printf "XXX\n%d\n%s\nXXX\n" $percent "$message" >&3
}


# Create the FIFO for communicating with the whiptail gauge
tmpd=$(mktemp --tmpdir --directory "wt.XXXXXXXXXX")
mkfifo "$tmpd/fifo"

# Start up the whiptail gauge and associate FD 3 with its status
whiptail --title 'Progress meter' --gauge 'Starting examples' 6 50 0 <"$tmpd/fifo" &
exec 3>"$tmpd/fifo"

# Real code starts here
percent=0

for example in 1 2 3
do
    updateGauge $percent "Getting example $example"
    sleep 3    # wget something

    percent=$((percent + 20))
done

for another in 4 5
do
    updateGauge $percent "Doing work for another example $another"
    sleep 2    # do some work

    percent=$((percent + 20))
done

# Done
tidyUp
exit 0
1
03.12.2019, 01:10
1 ответ

Исправление пары мелких ошибок в вашем примере, я не вижу проблемы, которую вы описываете

# Set up the scenario
mkdir /tmp/555270
cd /tmp/555270

cat <<'EOF' >script1
#!/bin/bash
logs_file=logs_file
exec &> >(tee "$logs_file")
echo "something"
exec "./script2"
EOF

cat <<'EOF' >script2
#!/bin/bash
echo "something else"
EOF

chmod a+x script?
rm -f logs_file

# Run the script
./script1
something
something else

# Examine the log file
cat logs_file
something
something else
0
27.01.2020, 23:56

Теги

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