Linux

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

  • July 10, 2021

我們最近從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/

基本上,它從prod切換到qa,保持相對目錄結構。

當我在 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/

在這裡,目錄沒有改變。

請幫忙。

這種替換是kshshell 提供的功能。

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
$

我不太確定那個 two-argument 的語義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採用-Land-P選項,我們也需要為它們實現適當的參數處理。只需檢查參數的數量,就可以cd -P directory嘗試進行替換。

此外,上面的函式不能很好地處理錯誤,例如路徑cd xyz somethingxyz沒有出現的地方只會讓你留在目前目錄中,而不是像 Ksh 那樣出錯。

引用自:https://unix.stackexchange.com/questions/657808