如何在 Linux 中使用 cd 命令替换

如何在 Linux 中使用 cd 命令替换

我们最近迁移自HP-UX B.11.31Linux 3.10.0-1160.15.2.el7.x86_64

我正在尝试实现以下目标(在早期的 HP-UX 系统中有效):

$ pwd
/global/app/opt/prod/ee/01/custo/src/
$ cd prod qa
/global/app/opt/qa/ee/01/custo/src/
$ pwd
/global/app/opt/qa/ee/01/custo/src/

基本上,它从产品质量保证,维护相对目录结构。

当我在 Linux 中尝试同样的想法时:

$ pwd
/global/app/opt/prod/ee/01/custo/src/
$ cd prod qa
-bash: cd: prod: No such file or directory
$ pwd
/global/app/opt/prod/ee/01/custo/src/

在这里,目录没有改变。

请帮忙。

答案1

这种替换是 shell 提供的功能ksh

外壳bash不提供它。

尝试切换到ksh以解决此问题。

$ pwd
/tmp/steve
$ cd ve phen
bash: cd: ve: No such file or directory
$ ksh
$ pwd
/tmp/steve
$ cd ve phen
/tmp/stephen
$

答案2

我不太确定该两个参数的语义cd,但对于简单的情况,类似的事情可能会起作用。这会在第一个参数中的字符串第一次出现在当前目录中时将其更改为第二个参数中的字符串,并打印新的目录名称。

#!/bin/bash
cdsub() {
    if [ "$#" = 2 ]; then
        local dir="${PWD/"$1"/"$2"}"
        printf "%s\n" "$dir"
        cd -- "$dir"
    else
        printf "usage: cdsub <string> <replacement>" >&2
    fi
}

所以,

$ cd /tmp/foo/foo
$ pwd
/tmp/foo/foo
$ cdsub foo bar
/tmp/bar/foo
$ pwd
/tmp/bar/foo

您可以将函数命名为cd,然后使用command cdinside 来避免陷入无休止的递归,但 Bash 也cd采用-L-P选项,我们也需要为它们实现适当的参数处理。只需检查参数的数量就可以进行类似cd -P directory尝试进行替换的操作。

另外,上面的函数不能很好地处理错误,例如路径中没有出现的cd xyz something地方xyz只会让您留在当前目录中,而不是像 Ksh 那样出错。

答案3

.bashrc 的 bash 实现:

# ksh-like change directory
# if two args, do substitution in PWD
cd_ksh () {
  if [ "$#" -ne 2 ]; then builtin cd $1; return; fi
  echo "   cd_ksh: substituting $1 with $2 in PWD"
  newdir=${PWD//$1/$2}
  builtin cd $newdir
}
export -f cd_ksh
alias cd=cd_ksh

在所有情况下,这将导致与内置 cd 命令相同的返回值

相关内容