如果您希望在离开前被询问:

如果您希望在离开前被询问:

我必须设置一个 bash 脚本,该脚本将在所有用户的自动运行中。

我无法将终端设置设置为在“进程完成”时关闭。我无法“杀死所有”终端。

有人知道一种方法吗?我认为 PID 解决方案(不是父 pid)将是一个很好的方法。

使用的操作系统是MacOS Sierra。

测试文件

#!bin/bash
currentUser=$(whoami)
mkdir -p ~/Desktop/Pdrive
mount_smbfs //server/UserData/$currentUser ~/Desktop/Pdrive


#pid=$$
#kill $pid
#exit 0
#kill -15 $$
#disown
#kill -9 $(ps -p $(ps -p $PPID -o ppid=) -o ppid=)
#osascript -e 'tell application "Terminal.app" to quit'
#pkill -f test.sh
exit

答案1

尝试这个:

如果您希望在离开前被询问:

osascript -e 'tell application "Terminal" to close first window' 

不问就离开:

osascript -e 'tell application "Terminal" to close first window' & exit

请不要使用,killall因为killall在不同的 Unix 版本上会做不同的事情。

答案2

source您可以使用(也称为)在当前 shell 中运行脚本.

. ./test.sh

这样,当您的脚本调用时exit,您的 shell 也会退出。这也会导致您的终端模拟器关闭。

但是,这不适用于具有默认设置的 macOS 终端,但您可以转到首选项 → 配置文件 → Shell →“当 shell 退出时”,然后选择“关闭窗口”或“如果 shell 干净退出则关闭”。

答案3

对于 Linux 和 macOS 来说更通用的东西:

#!/bin/bash -e

function kill_self_terminal {
  local tk_child_pid=$1
  if [[ $tk_child_pid == 1 ]]; then
    return 1
  fi
  local tk_parent_pid=$(ps -p $tk_child_pid -o ppid=)
  if [[ $tk_child_pid == $tk_parent_pid ]]; then
    return 1
  fi
  local tk_parent_command=$(ps -p $tk_parent_pid -o comm= | tr '[:upper:]' '[:lower:]')
  if [[ -n $tk_parent_command ]] && [[ $tk_parent_command == *term* ]]; then
    kill $tk_parent_pid
  else
    kill_self_terminal $tk_parent_pid
  fi
}

kill_self_terminal $$ || {
  echo "Unable to find terminal to close"
}

如果您使用不同的终端命令,只需将 tk_parent_command 检查更改为学期部分

重要的:我使用的是 Debian Linux 12,所以我希望这能在 macOS 上运行,让我知道如何调整脚本

相关内容