我使用sshfs将远程文件夹远程安装到本地计算机,问题是我需要一种方法来知道我是在本地机器上的远程文件夹下工作,还是在local文件夹下工作,以避免意外地对远程计算机造成伤害。
如何使用zsh/bash提示符来反映我目前处于远程挂载点,以便更仔细地执行操作?
示例: sshfs现在当我cd到local_of_remote_mountpoint时,提示符将通知我这是使用sshfs (如:user@host: sshfs% ls )挂载的文件夹。
发布于 2019-02-21 13:37:16
我们在这方面面临两个截然不同的问题:
sshfs挂载的文件系统上;sshfs?挂载的文件系统的当前工作目录部分。
将压水机与安装点进行比较是不可靠的。例如,如果PWD的某个组件是一个指向挂载点的符号链接,则它可能无法工作。
在GNU上,df和findmnt等工具能够确定目录所在的挂载点。另外,两者都可以报告文件系统的FSTYPE属性,对于由sshfs挂载的文件系统,该属性设置为fuse.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 shell变量,该变量作为主提示符展开。
在bash中,您可以在包装器中对相关函数执行此操作:cd、pushd和popd (credits:感谢这个对“条件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,则向PS1添加一个红色R字母。您可能希望根据您的首选项来调整PS1的默认值。
在zsh中,它更容易一些,因为每当更改当前工作目录时,zsh都会执行chpwd特殊函数(参考: Manual手册,特殊功能)。您可以向与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和添加D50钩子函数并不能确保正确设置提示符。您至少需要一个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%}')"'%# '请注意,print需要将\es转换为实际的转义字符,并且需要使用%{...%}表单以避免出现错误行为的提示代码。参考资料:zsh FAQ:如何在我的颜色x项上得到彩色提示?
如果您希望每次设置主提示符时都执行检查,则可以避免将钩子函数添加到chpwd_functions并添加到.zshrc中:
setopt PROMPT_SUBST
export PS1='%m$(check_sshfs_mp && print "%{\e[1;31m%} R %{\e[0m%}")%# '需要使用PROMPT_SUBST选项在提示显示中启用命令替换。参考:Z壳手册中的迅速扩展。
https://unix.stackexchange.com/questions/501789
复制相似问题