我必须设置一个 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 上运行,让我知道如何调整脚本