我想要做的事情应该非常清楚:
原始脚本.sh:
select blah in foo bar oof rab
do
cmd $blah
break
done
非常基础的东西。当我尝试以下操作时,问题出现了:
> xterm -e 'script.sh'
从 shell 调用 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 是 shell 内置命令。它等待每个指定的进程完成并返回其终止状态。 您可以参考这个帮助。
答案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
命令脚本.sh:
#!/bin/bash
exec hexdump /dev/urandom | grep --line-buffered -i "ffff f" > random &