
當我在終端上時,我希望有一些額外的二進位檔案/命令可用,由 CWD 觸發。
下面以目錄結構為例
├── P1
| ├── mybin
| │ └── cmd1
| ├── S1
| │ └── mybin
| │ └── cmd2
| ├── S2
└── P2
└── S3
然後在這個目錄結構中
cmd1
並可cmd2
在P1/S1
.- 僅
cmd1
適用於P1
或P1/S2
。 - 兩者都不可用
P2
或P2/S3
一般來說,我希望它適用於任何目錄結構。這類似於 git 偵測您是否位於 git 儲存庫中的方式。相當於把./mybin
, ../mybin
,../../mybin
放在 上$PATH
。
我應該如何修改我的PATH
才能使其正常工作?我正在使用 Fish shell,但我很樂意將任何其他 shell 的解決方案移植到我的 shell 中。
答案1
我明白你只是不高興
PATH="./mybin:../mybin:../../mybin:../../../mybin:$PATH"
直到某個限制,例如 8 個左右的子目錄。
我建議您使用一個簡短的包裝器,而不是污染和破壞您的常規命令查找,這樣遞歸查找將僅針對其前綴的命令進行。
例如。k foo
將嘗試./mybin/foo
、../mybin/foo
等,但只會像往常一樣foo
在 中找到。$PATH
但我沒有使用魚,而且我不知道如何用魚殼的語言寫它。對於 bash / ksh / zsh,它可能類似於:
function k {
typeset p=. cmd=$1; shift
while
typeset e=$p/mybin/$cmd
if [ -x "$e" ]; then "$e" "$@"; return; fi
[ ! "$p" -ef / ]
do
p=../$p
done
echo >&2 "k: not found: $cmd"; return 1
}
如果可行,您可以將其製作成獨立的可執行腳本,而不是嘗試將其轉換為 Fish:
#! /bin/bash
p=. cmd=$1; shift
while
e=$p/mybin/$cmd
if [ -x "$e" ]; then exec "$e" "$@"; fi
[ ! "$p" -ef / ]
do
p=../$p
done
echo >&2 "k: not found: $cmd"; exit 1