Должно быть совершенно ясно, что я пытаюсь сделать:
оригинальный скрипт.sh:
select blah in foo bar oof rab
do
cmd $blah
break
done
Довольно простые вещи. Проблема возникает, когда я пробую следующее:
> xterm -e 'script.sh'
script.sh отлично работает при вызове из оболочки. Но когда я пытаюсь вызвать его из fvwm, я не вижу никаких результатов от " cmd $blah
". Попытка следующей модификации ничего не дала:
select blah in foo bar oof rab
do
nohup cmd $blah > /dev/null 2>&1 &
break
done
Как мне добиться желаемой функциональности? (то есть, как сделать так, чтобы xterm отображался достаточно долго, чтобы я мог сделать выбор, а затем завершал работу, пока команда выполняется в фоновом режиме?)
решение1
Вы можете добавить в последнюю строку вашего скриптаждать PIDинструкция с PID
фоновой командой, которая вас интересует, завершит работу. Конечно, вам нужно сохранить это PID
в вашем скрипте.
#!/bin/bash
# do first stuff...
select blah in foo bar oof rab
do
cmd $blah &
PID_TO_WAIT_FOR=$! # here you store the PID of the last command
break
done
# do other stuff
wait $PID_TO_WAIT_FOR
Примечания:
- wait — встроенная команда оболочки.Он ожидает завершения каждого указанного процесса и возвращает его статус завершения. Вы можете обратиться к этомупомощь.
решение2
Подойдет ли вам, если вы запустите его в новом xterm
сеансе, а затем выйдете из текущего терминала? Это должно оставить новый терминал работающим.
xterm -e "bash -c \"./script.sh; exec bash\"" &
РЕДАКТИРОВАТЬ:
Подход ниже позволяет вам запустить скрипт из GUI в терминале, выбрать команду для запуска, выйти из терминала и иметь команду, которая все еще работает. В качестве примера я поместил некоторую команду в commandscript.sh
selectscript.sh:
#!/bin/bash
# Bash Menu Script Example
PS3='Please enter your choice: '
options=("Option 1" "Option 2" "Option 3" "Quit")
select opt in "${options[@]}"
do
case $opt in
"Option 1")
echo "you chose choice 1"
;;
"Option 2")
echo "you chose choice 2 HEXDUMP"
nohup bash commandscript.sh
;;
"Option 3")
echo "you chose choice 3"
;;
"Quit")
break
;;
*) echo invalid option;;
esac
done
commandscript.sh:
#!/bin/bash
exec hexdump /dev/urandom | grep --line-buffered -i "ffff f" > random &