Skip to content

[MacOS] 執行 shell 檔結束後自動關閉終端機

Last Updated on 2021-10-02 by Clay

在 Linux 作業系統中,我寫了很多輔助我日常生活會用到的功能的腳本程式,也就是我標題所打的 shell script、shell 檔。在之前 Linux 作業系統的筆電中,這些檔案很方便,會在我啟用時自動在背景執行程式並關掉終端機窗口。

但是在我將工作環境搬到 Mac OS 上後,我發現我舊的 shell script 基本上都還是能執行的,唯一的問題就是:在執行完程式之後,我的終端機(Terminal)不會自動關閉。

這對我而言是個大問題,畢竟誰都不喜歡自己的桌面上有一堆的小黑窗、然而又沒有做做事、得自己手動關閉,對吧?

在網路上搜尋了一段時間,最後終於在 StackOverflow 中找到了一個實測可行的解決方法,記錄如下。


在 shell script 執行完畢後自動關閉視窗

方法一:killall

在單純暴力的方法就是在 shell script 的最底下加入:

killall Terminal

但是要注意,這會關閉所有的終端機!如果只希望關閉當前的終端機,則可以參考後面的紀錄。


方法二:調整設定、使用 exit 0 (我個人無法成功)

在 Linux 當中,要離開終端機直接輸入 exit 即可,也是我原先使用的方法。但在 Mac OS 當中終端機卻無法順利關閉。看到 StackOverflow 上有人提到修改設定即可,故也一同紀錄下來。

不過,在我自己的裝置上是無法成功關閉終端機的。

選擇 Terminal => Preferences => Profiles => Shell => 將 When the shell exits: 的選項修改成 Close if the shell exited clearly

然後,在自己的 shell script 最底下寫入 exit 0,就可以退出了(據說)。

不過,我自己測試是無法順利退出的。


方法三: 在 shell script 中使用 AppleScript 關閉執行腳本的終端機

這個方法看起來很複雜,實際上卻很單純。使用以下語法即可成功退出。

osascript -e 'tell application "Terminal" to close (every window whose name contains "YOUR_SCRIPT_NAME")'

其中 YOUR_SCRIPT_NAME 需要改成你的 shell script 的名稱,才能順利關閉特定終端機。

以下我使用一個開啟資料夾的程式做個示範。

#!/bin/bash


close() {
    osascript -e 'tell application "Terminal" to close (every window whose name contains "open_folder.sh")'
}

nohup open ./ & close

然後我將開檔案命名為 open_folder.sh

以下是程式執行的結果:

可以看到程式能自動關閉終端機視窗並維持開啟資料夾的狀態、同時另一個終端機也不會被關閉。

方法三是我目前嘗試過比較好的解決方法。


References


Read More

2 thoughts on “[MacOS] 執行 shell 檔結束後自動關閉終端機”

Leave a Reply