提示反映 sshfs 掛載點?
我曾經
sshfs
將遠端文件夾遠端掛載到本地電腦,問題是我需要一種方法來知道我正在本地電腦上的遠端文件夾或local
文件夾下工作,以避免意外傷害遠端文件夾。如何讓 zsh/bash 提示以反映我目前處於遠端掛載點,以便我會更仔細地執行操作?
範例: sshfs now 當我 cd to 時
local_of_remote_mountpoint
,提示將通知我這是使用sshfs
如下方式安裝的文件夾:user@host: sshfs% ls
我們在這裡面臨兩個不同的問題:
- 如何知道目前工作目錄(PWD)是否在由
sshfs
;掛載的文件系統上- 如何在 shell 提示中反映第 1 點。
文件系統的目前工作目錄的一部分是由 安裝的
sshfs
嗎?將 PWD 與掛載點進行比較是不可靠的。例如,如果您的 PWD 的一個組件是一個掛載點的符號連結,它可能不起作用。
df
在 GNU/Linux 上,工具findmnt
能夠確定目錄所在的掛載點。此外,兩者都可以報告FSTYPE
文件系統的屬性,該屬性設置fuse.sshfs
為由sshfs
.因此,您可以檢查:
# df always prints a header line, we want to skip it [ "fuse.sshfs" = "$(df --output=fstype . | tail -n +2)" ] && ...
或者:
[ "fuse.sshfs" = "$(findmnt --noheadings --output=FSTYPE --target .)" ] && ...
您可以將此測試包裝在一個腳本中,並使其在您的
PATH
. 在這裡,我們將呼叫它check_sshfs_mp
:#!/bin/sh [ "fuse.sshfs" = "$(findmnt --noheadings --output=FSTYPE --target .)" ] && exit 0 exit 1
如何根據我們所在的掛載點設置 shell 提示符?
在兩者中
bash
,zsh
您都可以設置PS1
shell 變數,該變數被擴展為主要提示。在
bash
您可以在相關功能的包裝器中執行此操作:cd
和pushd
(popd
學分:感謝對“條件 PS1”的回答提醒我cd
不是唯一的),將此程式碼添加到您的~/.bashrc
:cd () { builtin cd "$@" && chpwd; } pushd () { builtin pushd "$@" && chpwd; } popd () { builtin popd "$@" && chpwd; } chpwd () { normal='\[\e[0m\]' red='\[\e[1;31m\]' PS1='[\u@\h \W]\$ ' if command -v check_sshfs_mp > /dev/null 2>&1; then check_sshfs_mp && PS1='[\u@\h '"$red"'R'"$normal"' \W]\$ ' fi }
該
chpwd
函式呼叫check_sshfs_mp
,如果其退出狀態為0
,則向 中添加一個紅色R
字母PS1
。您可能需要根據自己的喜好調整預設值。
PS1
在
zsh
某種程度上更容易,因為只要目前工作目錄發生更改,就會zsh
執行特殊功能(參考:Z Shell 手冊,特殊功能)。您可以將提示設置函式添加到與 一起執行的鉤子函式數組中。 假設您沒有使用乾擾提示設置的使用者貢獻,您可以將此程式碼添加到您的:chpwd``chpwd
~/.zshrc
chpwd_check_sshfs_mp () { PS1='%m%# ' if command -v check_sshfs_mp > /dev/null 2>&1; then check_sshfs_mp && PS1='%m %F{red}R%f %# ' fi } chpwd_functions+=( chpwd_check_sshfs_mp )
同樣,我們只是在成功
R
時向主提示添加紅色。chech_sshfs_mp
請注意,如果您的終端啟動的 PWD 位於已安裝的文件系統上,則包裝
cd
和添加chpwd_functions
掛鉤函式將無法確保正確設置提示。sshfs
您至少需要 acd
來觸發正確的提示,這可能會產生誤導。使用者對
zsh
執行提示主題的貢獻將需要臨時解決方案來自定義提示。您仍然可以關閉提示主題
prompt off
試驗這段程式碼。
評論中提出的積分點
zsh
:如果您更喜歡使用ANSI 轉義序列(而不是顏色名稱)指定提示著色,您可以
PS1
將上述程式碼片段中的賦值行更改為:check_sshfs_mp && PS1="$(print '%m %{\e[1;31m%}R%{\e[0m%} %# ')"
或者
PS1='%m'"$(check_sshfs_mp && print '%{\e[1;31m%} R %{\e[0m%}')"'%# '
請注意,
\e
s 轉換為實際的轉義字元,並且%{...%}
需要表單以避免提示程式碼行為不端。參考:zsh
常見問題解答:如何在我的顏色 xterm 上獲得彩色提示?如果您希望每次設置主要提示時都執行檢查,您可以避免添加掛鉤函式
chpwd_functions
並添加到您的.zshrc
:setopt PROMPT_SUBST export PS1='%m$(check_sshfs_mp && print "%{\e[1;31m%} R %{\e[0m%}")%# '
需要該
PROMPT_SUBST
選項才能在提示顯示中啟用命令替換。參考: Z Shell 手冊中的提示擴展。