リモートフォルダをローカルコンピュータにリモートでマウントするために使用しています。sshfs
問題は、local
誤ってリモートフォルダに害を及ぼすのを防ぐために、ローカルコンピュータのリモートフォルダの上または下で作業していることを知る方法が必要であることです。
私が現在リモートマウントポイントにあることをzsh / bashプロンプトに反映してより慎重に作業を行うにはどうすればよいですか?
例:sshfsでCDを実行すると、次のようにマウントされたフォルダlocal_of_remote_mountpoint
というメッセージが表示されます。sshfs
user@host: sshfs% ls
ベストアンサー1
ここでは、2つの異なる問題に直面しています。
- 現在の作業ディレクトリ(PWD)が
sshfs
次にマウントされたファイルシステムに存在することを確認するには: - シェルプロンプトでポイント1を反映する方法。
現在の作業ディレクトリがマウントされているファイルシステムの一部ですかsshfs
?
PWDを取付点と比較することは信頼できません。たとえば、そのコンポーネントがマウントポイントへのシンボリックリンクである場合、PWDは機能しない可能性があります。
GNU / Linuxでは、df
同じツールを使用してディレクトリがある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
現在のマウントポイントに基づいてシェルプロンプトをどのように設定しますか?
bash
どちらもデフォルトのプロンプトに展開されるシェル変数をzsh
設定できます。PS1
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
ため、やや簡単です。 (注:Zシェルマニュアル、zsh
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
フック機能をラップして追加してもプロンプトが正しく設定されていることを確認できません。正しいプロンプトをトリガーするには、少なくともaが必要です。これは誤解を招く可能性があります。chpwd_functions
sshfs
cd
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
%{...%}
zsh
color xtermでカラーヒントを取得する方法は?
デフォルトのプロンプトが設定されるたびに確認を実行するには、フック機能を追加せずにchpwd_functions
次の項目に追加します.zshrc
。
setopt PROMPT_SUBST
export PS1='%m$(check_sshfs_mp && print "%{\e[1;31m%} R %{\e[0m%}")%# '
PROMPT_SUBST
このオプションは、プロンプト表示でコマンド置換を有効にするために必要です。引用:急速な拡張Z Shell マニュアルにあります。