私たちは最近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
この代替機能はシェルが提供する機能です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
これら2つのパラメータの意味についてはわかりませんが、cd
単純な場合は同様のことが機能する可能性があります。これは、最初の引数の文字列を現在のディレクトリに最初に表示されたときに2番目の引数の文字列に変更し、新しいディレクトリ名を印刷します。
#!/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
内部で使用できますが、Bashもオプションを使用するため、適切な引数処理も実装する必要があります。引数の数を確認し、置換を試みるなどの操作を実行します。command cd
cd
-L
-P
cd -P directory
また、上記の関数はエラーをうまく処理できません。たとえば、パスに存在しない場合、Kshのようにエラーが発生するのではなく、現在のディレクトリに残りますcd xyz something
。xyz
答え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コマンドと同じ戻り値が発生します。