透過分層 $PATH 在目前目錄的父目錄中遞歸來尋找二進位文件

透過分層 $PATH 在目前目錄的父目錄中遞歸來尋找二進位文件

當我在終端上時,我希望有一些額外的二進位檔案/命令可用,由 CWD 觸發。

下面以目錄結構為例

├── P1
|   ├── mybin
|   │   └── cmd1
|   ├── S1
|   │   └── mybin
|   │       └── cmd2
|   ├── S2
└── P2
    └── S3

然後在這個目錄結構中

  • cmd1並可cmd2P1/S1.
  • cmd1適用於P1P1/S2
  • 兩者都不可用P2P2/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

相關內容