Linux
如何在 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/
基本上,它從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/
在這裡,目錄沒有改變。
請幫忙。
這種替換是
ksh
shell 提供的功能。
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 cd
inside 以避免陷入無休止的遞歸,但 Bash也cd
採用-L
and-P
選項,我們也需要為它們實現適當的參數處理。只需檢查參數的數量,就可以cd -P directory
嘗試進行替換。此外,上面的函式不能很好地處理錯誤,例如路徑
cd xyz something
中xyz
沒有出現的地方只會讓你留在目前目錄中,而不是像 Ksh 那樣出錯。