プロンプトにsshfsマウントポイントが反映されますか?

プロンプトにsshfsマウントポイントが反映されますか?

リモートフォルダをローカルコンピュータにリモートでマウントするために使用しています。sshfs問題は、local誤ってリモートフォルダに害を及ぼすのを防ぐために、ローカルコンピュータのリモートフォルダの上または下で作業していることを知る方法が必要であることです。

私が現在リモートマウントポイントにあることをzsh / bashプロンプトに反映してより慎重に作業を行うにはどうすればよいですか?

例:sshfsでCDを実行すると、次のようにマウントされたフォルダlocal_of_remote_mountpointというメッセージが表示されます。sshfsuser@host: sshfs% ls

ベストアンサー1

ここでは、2つの異なる問題に直面しています。

  1. 現在の作業ディレクトリ(PWD)がsshfs次にマウントされたファイルシステムに存在することを確認するには:
  2. シェルプロンプトでポイント1を反映する方法。

現在の作業ディレクトリがマウントされているファイルシステムの一部ですかsshfs

PWDを取付点と比較することは信頼できません。たとえば、そのコンポーネントがマウントポイントへのシンボリックリンクである場合、PWDは機能しない可能性があります。

GNU / Linuxでは、df同じツールを使用してディレクトリがあるfindmntマウントポイントを決定できます。また、両方でFSTYPE設定されたファイルシステムの属性を報告することもできます。fuse.sshfssshfs

したがって、以下を確認できます。

# 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 .)" ] && ...

このテストをスクリプトにラップしてから利用可能にすることができますPATHcheck_sshfs_mp

#!/bin/sh
[ "fuse.sshfs" = "$(findmnt --noheadings --output=FSTYPE --target .)" ] && exit 0
exit 1

現在のマウントポイントに基づいてシェルプロンプトをどのように設定しますか?

bashどちらもデフォルトのプロンプトに展開されるシェル変数をzsh設定できます。PS1

bash関連関数の周りのラッパーでこれを行うことができます:cd、、pushdpopdクレジット:「条件付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追加します。必要に応じてデフォルト値を調整する必要があります。0RPS1
PS1

現在の作業ディレクトリが変更されるたびに特別な機能が実行されるzshため、やや簡単です。 (注:Zシェルマニュアル、zshchpwd特殊機能)。一緒に実行されるフック機能の配列にプロンプ​​ト設定機能を追加できます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フック機能をラップして追加してもプロンプトが正しく設定されていることを確認できません。正しいプロンプトをトリガーするには、少なくともaが必要です。これは誤解を招く可能性があります。chpwd_functionssshfscd

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%}')"'%# '

sは実際のエスケープ文字に変換する必要がprintあり、プロンプトコードで誤動作を防ぐためにその形式を使用する必要があります。参考資料:よくある質問:\e%{...%}zshcolor xtermでカラーヒントを取得する方法は?

デフォルトのプロンプトが設定されるたびに確認を実行するには、フック機能を追加せずにchpwd_functions次の項目に追加します.zshrc

setopt PROMPT_SUBST
export PS1='%m$(check_sshfs_mp && print "%{\e[1;31m%} R %{\e[0m%}")%# '

PROMPT_SUBSTこのオプションは、プロンプト表示でコマンド置換を有効にするために必要です。引用:急速な拡張Z Shell マニュアルにあります。

おすすめ記事