使用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
。我测试了一下,对我来说效果很好