2013-11-09 90 views
1

我写了一个简单的脚本脚本退出后如何退出终端?

#!/bin/bash 
nohup $1 & 
exit 

什么是应该做的是,如果我执行'scriptName' gedit,就必须打开gedit中,然后关闭终端。但是,问题是脚本执行后终端未关闭。的照顾

事情:

  • 经过终端的喜好来When command exits: Exit the terminal
  • 我想把这个脚本/usr/local/bin所以,我不能使用的执行等。 ./scriptname
  • 它看起来像终端不是这个的父母。我该如何改变这一点?

回答

2

您尝试的方法将不会工作,原因如下:

您的终端会话的shell是一个进程;通常当你执行一个shell脚本时,终端会话shell启动第二个shell进程并在其下运行脚本。因此,脚本末尾的exit会告诉第二个shell终止 - 无论如何,它将执行终止操作,因为它已到达脚本的末尾。虽然您可以尝试从第二个shell进程中查看第一个shell进程(请参阅其他答案中的有关$PPID的评论),但这不是很好的形式。

您的脚本工作,你期望它的工作方式,你需要让你的终端会话外壳使用bash的内建source命令来运行脚本中的命令 - 型source /path/to/your/script gedit,或. /path/to/your/script gedit的简称。

由于您需要执行此操作的方式,将脚本放在您的PATH上将无济于事 - 但您可以创建一个别名(一种扩展为一系列shell命令的“快捷方式”),以使其运行脚本更容易 - 在您的~/.bashrc中添加一条线,例如alias your_alias_name='. /path/to/your/script'

+0

'exec nohup gedit'当我尝试时,没有关闭终端。我有没有办法获得正在执行脚本的终端的PID,然后杀死它? – nitishch

+0

是的,我的错误。一个别名不会帮助你运行'exec nohup gedit&',或者就此而言'exec nohup gedit -d'。我大幅修改了我的回复 - 请再试一次。 – pobrelkey

+0

是的,谢谢,它的工作。所以,'source'说要使用相同的shell来运行脚本而不创建子shell? – nitishch

0

我假设你在Mac上 - 因为你提到了首选项。问题是你是如何开始剧本的?

如果您启动了终端,然后从终端运行“scriptName”,终端将不会退出,因为它仍在运行您的shell。仔细检查首选项,它会显示“当shell退出”时,而不是“命令退出时”。

+0

我使用Ubuntu,它说“当命令退出”是配置文件首选项。 – nitishch

+1

“nohup”以“kill $ PPID”退出后,您可能会杀死您的脚本的父进程 –

+0

我试过了,它没有工作 – nitishch

0

在示例脚本下面给出。

#!/bin/bash 
echo "hi" 
/bin/bash/abc.sh & 
sleep 2 
#sleep is used to pause the execution temporary to see the output. 
kill -25 $PPID 

传递给kill命令的值决定了行为。 Here你可以找到不同的值。

杀-25为我工作,关闭终端,并确保在命令的末尾添加“&”。 :)