Linux

如何在fish shell中啟用自動註銷?

  • August 24, 2021

一個快速的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 中可用選項的限制. 也就是說,如果您在使用任何可以控制終端的“全屏”應用程序(例如 、 或許多其他應用程序)時走開lessvim那麼它將無法正常工作。 僅當您在提示符處TMOUT讓 Bash 空閒時才處理。

同樣,這種方法也有同樣的局限性。考慮到這一點 …

Bash 手冊有這樣的說法TMOUT

在互動式 shell 中,該值被解釋為在發出主要提示後等待輸入行的秒數。如果完整的輸入行沒有到達,Bash 在等待該秒數後終止。

用 Fish 的話說,這將是:

  • 顯示兩個連續提示之間的時間段
  • 顯示提示和使用者輸入互動式命令之間的時間段

Fish 函式鉤子可以處理以下內容:

  • fish_prompt
  • fish_preexec

所以上面的腳本:

  • sleep顯示提示 ( ) 時啟動自動註銷計時器 (通過fish_prompt)
  • 當顯示下一個提示 ( fish_prompt) 或輸入命令( ) 時,停止該計時器(通過終止擁有計時器的子程序並註銷fish_preexec)。
  • SIGHUP當計時器到期而沒有被殺死時,從 shell 中註銷(通過)

引用自:https://unix.stackexchange.com/questions/662918