如何执行命令并立即退出终端?

如何执行命令并立即退出终端?

我想要做的事情应该非常清楚:

原始脚本.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 &

相关内容