LinuxでCDコマンド置換を使用する方法

LinuxでCDコマンド置換を使用する方法

私たちは最近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 cdcd-L-Pcd -P directory

また、上記の関数はエラーをうまく処理できません。たとえば、パスに存在しない場合、Kshのようにエラーが発生するのではなく、現在のディレクトリに残りますcd xyz somethingxyz

答え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コマンドと同じ戻り値が発生します。

関連情報