首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提示反映sshfs挂载点?

提示反映sshfs挂载点?
EN

Unix & Linux用户
提问于 2019-02-20 08:24:01
回答 1查看 377关注 0票数 2

我使用sshfs将远程文件夹远程安装到本地计算机,问题是我需要一种方法来知道我是在本地机器上的远程文件夹下工作,还是在local文件夹下工作,以避免意外地对远程计算机造成伤害。

如何使用zsh/bash提示符来反映我目前处于远程挂载点,以便更仔细地执行操作?

示例: sshfs现在当我cd到local_of_remote_mountpoint时,提示符将通知我这是使用sshfs (如:user@host: sshfs% ls )挂载的文件夹。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2019-02-21 13:37:16

我们在这方面面临两个截然不同的问题:

  1. 如何知道当前工作目录(PWD)是否在sshfs挂载的文件系统上;
  2. 如何在shell提示符中反映第1点。

是由sshfs?

挂载的文件系统的当前工作目录部分。

将压水机与安装点进行比较是不可靠的。例如,如果PWD的某个组件是一个指向挂载点的符号链接,则它可能无法工作。

在GNU上,dffindmnt等工具能够确定目录所在的挂载点。另外,两者都可以报告文件系统的FSTYPE属性,对于由sshfs挂载的文件系统,该属性设置为fuse.sshfs

因此,您可以检查:

代码语言:javascript
复制
# df always prints a header line, we want to skip it
[ "fuse.sshfs" = "$(df --output=fstype . | tail -n +2)" ] && ...

或者:

代码语言:javascript
复制
[ "fuse.sshfs" = "$(findmnt --noheadings --output=FSTYPE --target .)" ] && ...

您可以将此测试包装在脚本中,并使其在PATH中可用。在这里,我们将称之为check_sshfs_mp

代码语言:javascript
复制
#!/bin/sh
[ "fuse.sshfs" = "$(findmnt --noheadings --output=FSTYPE --target .)" ] && exit 0
exit 1

如何根据我们所在的挂载点设置shell提示符?

bashzsh中,您都可以设置PS1 shell变量,该变量作为主提示符展开。

bash中,您可以在包装器中对相关函数执行此操作:cdpushdpopd (credits:感谢这个对“条件PS1”的回答用于提醒我,cd不是唯一的),将此代码添加到~/.bashrc中:

代码语言:javascript
复制
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中:

代码语言:javascript
复制
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的贡献将需要特殊的解决方案来定制提示。尽管如此,您还是可以关闭提示主题

代码语言:javascript
复制
prompt off

来实验这段代码。

关于zsh的评论中提到的集成点:

如果您喜欢使用ANSI逃逸序列 (而不是颜色名称)指定提示着色,则可以将上面代码段中的PS1赋值行更改为:

代码语言:javascript
复制
check_sshfs_mp && PS1="$(print '%m %{\e[1;31m%}R%{\e[0m%} %# ')"

代码语言:javascript
复制
PS1='%m'"$(check_sshfs_mp && print '%{\e[1;31m%} R %{\e[0m%}')"'%# '

请注意,print需要将\es转换为实际的转义字符,并且需要使用%{...%}表单以避免出现错误行为的提示代码。参考资料:zsh FAQ:如何在我的颜色x项上得到彩色提示?

如果您希望每次设置主提示符时都执行检查,则可以避免将钩子函数添加到chpwd_functions并添加到.zshrc中:

代码语言:javascript
复制
setopt PROMPT_SUBST
export PS1='%m$(check_sshfs_mp && print "%{\e[1;31m%} R %{\e[0m%}")%# '

需要使用PROMPT_SUBST选项在提示显示中启用命令替换。参考:Z壳手册中的迅速扩展

票数 3
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/501789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档