Arch-Linux

提示反映 sshfs 掛載點?

  • March 11, 2019

我曾經sshfs將遠端文件夾遠端掛載到本地電腦,問題是我需要一種方法來知道我正在本地電腦上的遠端文件夾或local文件夾下工作,以避免意外傷害遠端文件夾。

如何讓 zsh/bash 提示以反映我目前處於遠端掛載點,以便我會更仔細地執行操作?

範例: sshfs now 當我 cd to 時local_of_remote_mountpoint,提示將通知我這是使用sshfs如下方式安裝的文件夾:user@host: sshfs% ls

我們在這裡面臨兩個不同的問題:

  1. 如何知道目前工作目錄(PWD)是否在由sshfs;掛載的文件系統上
  2. 如何在 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 提示符?

在兩者中bashzsh您都可以設置PS1shell 變數,該變數被擴展為主要提示。

bash您可以在相關功能的包裝器中執行此操作:cdpushdpopd學分:感謝對“條件 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%}')"'%# '

請注意,print需要將\es 轉換為實際的轉義字元,並且%{...%}需要表單以避免提示程式碼行為不端。參考: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 手冊中的提示擴展

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