使用bash重新匹配的cd和pwd的结果
我希望运行使用bash重新匹配的cd和pwd的结果,bash,Bash,我希望运行pwd,如果内容包括“/Volumes/Storage/Users/testuser/”,则重定向到~/,然后是pwd的其余内容。例如,如果pwd返回: /Volumes/Storage/Users/testuser/Desktop/folder1/folder2/ 此bash脚本将cd转换为: ~/Desktop/folder1/folder2/ 到目前为止,我得到的是这个,但我似乎无法让比赛组正确显示: [[ $(pwd) =~ \/Volumes\/Storage\/User
pwd
,如果内容包括“/Volumes/Storage/Users/testuser/”,则重定向到~/,然后是pwd
的其余内容。例如,如果pwd返回:
/Volumes/Storage/Users/testuser/Desktop/folder1/folder2/
此bash脚本将cd转换为:
~/Desktop/folder1/folder2/
到目前为止,我得到的是这个,但我似乎无法让比赛组正确显示:
[[ $(pwd) =~ \/Volumes\/Storage\/Users\/testuser\/(.*) ]] && cd "~/${BASH_REMATCH[1]}"
波浪号不能被引用,否则
cd
将看到一个文本~
字符
cd ~/"${BASH_REMATCH[1]}"
您也不需要为了它的价值而逃避斜杠。您不应该在正则表达式中使用斜杠 另外,
~
不能在字符串中正常工作,正如John Kugelman所提到的
if [[ $(pwd) =~ /Volumes/Storage/Users/testuser/(.*) ]]; then
cd "$HOME/${BASH_REMATCH[1]}"
fi
也许你对另一种解决方案感兴趣 我建议下面使用shell参数展开
PREFIX="/Volumes/Storage/Users/testuser/"
PWD=`pwd`
[[ ${PWD} =~ ${PREFIX}* ]] && cd ~/"${PWD#${PREFIX}}"
表单
${PWD#${PREFIX}}
删除${PREFIX}
开头的${PWD}
您想做什么
如果用户试图cd
到/Volumes/Storage/Users/testuser/Desktop/folder1/folder2/
,并且他们的主目录是/HOME/bob
,他们应该cd
到/HOME/bob/Desktop/folder1/folder2
如果/home/bob/Desktop/folder1/folder2
不存在怎么办
这里有一个函数,它可以将cd
替换为一个将你要cd'ing到的目录的函数。别名\u cd
到cd
,一切就绪
如果不使用cd
命令,那么在其他shell脚本中也可以执行相同的基本操作
我正在使用${parameter#word}
语法删除$BAD_DIR
前缀。我使用glob匹配来查看目录是否以坏目录作为前缀
然后我使用HOME\u DIR=~
设置我真正的主目录。我不知道如果用户咀嚼$HOME
,如果它改变了~
,会发生什么。但是,这允许我在目录名中使用引号
我可能应该检查$PWD
以确保它们不在那里,并验证这是否是一张相对的cd
vs一张给出完整路径的cd。然而,这很容易添加进去。这足够让你走了
function _cd {
cd_to_dir="$1"
BAD_DIR="/Volumes/Storage/Users/testuser"
if [[ $cd_to_dir = $BAD_DIR* ]]
then
HOME_DIR=~
cd_to_dir="$HOME_DIR/${cd_to_dir#${BAD_DIR}}"
fi
\cd "$cd_to_dir"
}
alias cd=_cd
这在我的电脑上起作用。我有BASH,但我还设置了extglob
和其他一些东西。此应在未设置extglob
的情况下运行,但如果未添加以下行:
function _cd {
cd_to_dir="$1"
BAD_DIR="/Volumes/Storage/Users/testuser"
is_extglob_set=$(shopt -q extglob)
[ $is_extglob_set ] || shopt -s extglob
if [[ $cd_to_dir = $BAD_DIR* ]]
then
HOME_DIR=~
cd_to_dir="$HOME_DIR/${cd_to_dir#${BAD_DIR}}"
fi
[ $is_extglob_set ] || shopt -u extglob
\cd $cd_to_dir
}
alias cd=_cd
是的,我试过了,但没用。它只返回~/(例如,
/Users/testuser
)的内容,没有任何bash重新匹配。或者在双引号中使用$HOME而不是~。正如我对@John_Kugelman提到的,只有cd进入~/
,没有正则表达式匹配。这似乎很有希望,但我似乎无法在脚本中运行它。如果我在一行中分别调用每个命令,它可以正常工作。要扩展最后一条注释,如果我将其放在脚本中,它似乎根本不起任何作用。可能您在错误的目录中,条件失败。为了调试的目的,在那里放一些echo
。我测试了一下,对我来说效果很好