我们最近迁移自HP-UX B.11.31到Linux 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 cd
inside 来避免陷入无休止的递归,但 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 命令相同的返回值