Zenity не отменяет и не отображает сообщение, потому что не видит переменную

Я написал простой скрипт для wget и zenity для отмены:

#!/bin/bash
((
   wget http://d3qnbzt7ix5jlv.cloudfront.net/ubuntu-12.04-desktop-i386.iso & export PID=$$
   wait $PID
   export YES=$?
)&) | zenity --progress --pulsate --auto-close
if [ $? -eq 1 ]; then
  kill $PID
fi
if [ "$YES" = "0" ]; then
   zenity --info
elif [ "$YES" = "1" ]; then
   zenity --error
fi

Kill не видит процесс $PID. Zenity не отображает последнее окно ($YES). Почему?


person user1365064    schedule 30.04.2012    source источник
comment
у вас есть две создаваемые подоболочки, т.е. '(' первая подоболочка, '(' вторая подоболочка как первые 2 символа в вашем скрипте. Ни один дочерний процесс не может изменить значение или создать переменную в родительском процессе. Это верно для оболочек тоже. Вы можете вернуть значение для назначения в родительском элементе, т. е. YES=$( wget ... ), но, поскольку вы хотите передать его в zenity, это не сработает. Может быть способ дублировать вывод или переназначить stdin для каждого процесса с использованием нотации типа exec 4>&1, но у меня нет времени, чтобы понять это. Также не ясен смысл конца вашего первого предложения. Удачи.   -  person shellter    schedule 01.05.2012
comment
Я хочу, чтобы оболочка читала из подоболочки $! и $?.   -  person user1365064    schedule 01.05.2012
comment
настройте несколько простых тестов, игнорируя канал в zenity, и вы увидите, что вы не можете изменять значения переменных между подоболочками, вы можете только «отправить» значение через cmd-подстановку, т.е. var=$( printf "value\n") Удачи.   -  person shellter    schedule 01.05.2012


Ответы (1)


Это не совсем ответ, но комментарий исказит фрагмент кода:


/usr/bin/userinstall-wget:

#!/bin/sh
# a wget wrapper to get these under a separate shell *and* progname

[ -n "$1" -a -n "$2" ] || exit 1

LANG=C \
wget -O "$1" --content-disposition --progress=bar:force:noscroll "$2" 2>&1 \
| stdbuf -i0 -o0 -e0 tr '>' '\n' \
| stdbuf -i0 -o0 -e0 sed -rn 's/^.*\<([0-9]+)%\[.*$/\1/p'

# NB: those coughing at this particular killall are welcome with patches
download() {
        userinstall-wget "$outfile" "$url" | (
                trap 'killall userinstall-wget' HUP
                zenity --progress --time-remaining --auto-close --auto-kill \
                        --text="Wait please..." \
                        --title="Downloading file"
        )
}

Они были собраны вместе как часть скриптов оболочки userinstall для ALT Linux.

ХТН

PS: сбросьте --progress=bar:force:noscroll со старым wget

person Michael Shigorin    schedule 28.10.2015