如何在fish shell中啟用自動註銷?
一個快速的Google搜尋說我可以通過設置一個 TMOUT 參數來啟用自動註銷(對於文本控制台)。但是,我後來發現這只適用於 bash shell。
如果我的預設外殼是魚,有沒有辦法可以設置自動註銷的計時器?
什麼目的?安全,當然。我希望它在空閒 1 分鐘時鎖定。
雖然 Fish 本身不包括
TMOUT
直接支持,但有一些替代方案可能對您有用。鑑於我的兩種方法截然不同,我將把它們包含在兩個單獨的答案中。首先(不是我喜歡的方法,但它最接近 Bash 功能),具體取決於您的 Fish 版本:
簡短的回答:
創建一個新文件
~/.config/fish/conf.d/fish_tmout.fish
:function start_logout_timer --on-event fish_prompt # Allows $last_pid to work in a function status job-control full if set --query __fish_tmout_pid # Stop previous timer kill -- -$__fish_tmout_pid end # Start new timer FISH_PID=%self sh -c "sleep 60; kill -HUP $FISH_PID" & # Allows logout without warning of background jobs disown set -gx __fish_tmout_pid $last_pid end function stop_logout_timer --on-event fish_preexec if set --query __fish_tmout_pid kill -- -$__fish_tmout_pid end set --erase __fish_tmout_pid end
重新啟動您的 shell,您應該會發現您在 shell 中沒有任何活動 1 分鐘後會自動註銷。
兼容性:至少 Fish 3.2.2 及更高版本。已知不適用於 3.0.2 及更早版本。
小警告:當您執行
ps
.注意:這確實可以處理多個執行的 shell 實例,因為每個 shell 都在一個全域(非通用)變數中跟踪自己的 PID 和計時器。
解釋:
您可以嘗試通過其他 Fish 功能複制該 Bash 功能。但是由於(根據您對 Stack Overflow 的評論),您希望這樣做是為了保護您周圍其他人的會話,以防您忘記註銷,您應該了解此
TMOUT
選項和其他 shell 中可用選項的限制. 也就是說,如果您在使用任何可以控制終端的“全屏”應用程序(例如 、 或許多其他應用程序)時走開less
,vim
那麼它將無法正常工作。 僅當您在提示符處TMOUT
讓 Bash 空閒時才處理。同樣,這種方法也有同樣的局限性。考慮到這一點 …
Bash 手冊有這樣的說法
TMOUT
:在互動式 shell 中,該值被解釋為在發出主要提示後等待輸入行的秒數。如果完整的輸入行沒有到達,Bash 在等待該秒數後終止。
用 Fish 的話說,這將是:
- 顯示兩個連續提示之間的時間段
- 顯示提示和使用者輸入互動式命令之間的時間段
Fish 函式鉤子可以處理以下內容:
fish_prompt
fish_preexec
所以上面的腳本:
sleep
顯示提示 ( ) 時啟動自動註銷計時器 (通過fish_prompt
)- 當顯示下一個提示 (
fish_prompt
) 或輸入命令( ) 時,停止該計時器(通過終止擁有計時器的子程序並註銷fish_preexec
)。SIGHUP
當計時器到期而沒有被殺死時,從 shell 中註銷(通過)