脚本退出后如何退出终端?

问题描述 投票:1回答:3

我写了一个简单的脚本

#!/bin/bash
nohup $1 &
exit

它应该做的是如果我执行'scriptName' gedit,它必须打开gedit然后关闭终端。但是,问题是终端在脚本执行后没有关闭。

事情照顾:

  • 检查了When command exits: Exit the terminal的终端偏好
  • 我想把这个脚本放在/usr/local/bin中,所以我不能像执行这样的执行。 ./scriptname
  • 看起来终端不是这个的父母。我该如何改变?
bash shell terminal
3个回答
2
投票

您正在尝试的方法将不起作用,原因如下:

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

为了使您的脚本按预期的方式工作,您需要使用bash的内置source命令让终端会话shell运行脚本中的命令 - 输入source /path/to/your/script gedit或简称. /path/to/your/script gedit

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


0
投票

我假设你在Mac上 - 因为你提到偏好。问题是你是如何启动脚本的?

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


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你可以找到不同的价值观。

Kill -25让我关闭终端,并确保在命令结束时添加“&”。 :)

© www.soinside.com 2019 - 2024. All rights reserved.