我希望运行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]}"
你也不需要逃避斜杠,因为它的价值。
也许您对替代解决方案感兴趣。
我建议使用外壳参数扩展进行以下操作。
PREFIX="/Volumes/Storage/Users/testuser/"
PWD=`pwd`
[[ ${PWD} =~ ${PREFIX}* ]] && cd ~/"${PWD#${PREFIX}}"
表单${PWD#${PREFIX}}
删除${PWD}
开头的${PREFIX}
。
你不应该在你的正则表达式中
去掉斜杠。此外,正如 John Kugelman 所提到的,~
在字符串中无法正常工作。
if [[ $(pwd) =~ /Volumes/Storage/Users/testuser/(.*) ]]; then
cd "$HOME/${BASH_REMATCH[1]}"
fi
你想做什么?
如果用户尝试cd
/Volumes/Storage/Users/testuser/Desktop/folder1/folder2/
并且他们的 HOME 目录/home/bob
,他们应该cd
/home/bob/Desktop/folder1/folder2
吗?
如果/home/bob/Desktop/folder1/folder2
不存在怎么办?
这里有一个函数,可以将cd
替换为一个将您 CD 到的目录替换为一个函数。别名_cd
cd
,一切就绪。
如果您不修改 cd
命令,可以在其他 shell 脚本中完成相同的基本操作。
我正在使用${parameter#word}
语法来删除$BAD_DIR
前缀。我使用 glob 匹配来查看目录是否将坏目录作为前缀。
然后我使用HOME_DIR=~
来设置我真正的 HOME 目录。我不知道如果用户$HOME
改变~
会发生什么。但是,这允许我在目录名称中使用引号。
我可能应该检查$PWD
以确保它们还没有,并验证这是否是相对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