계층적 $PATH를 통해 현재 디렉터리의 부모에 있는 바이너리를 재귀적으로 조회합니다.

계층적 $PATH를 통해 현재 디렉터리의 부모에 있는 바이너리를 재귀적으로 조회합니다.

CWD에 의해 트리거되는 터미널에 있을 때 몇 가지 추가 바이너리/명령을 사용할 수 있기를 원합니다.

다음은 한 가지 예로서 디렉토리 구조입니다.

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

그런 다음 이 디렉토리 구조에서

  • cmd1cmd2에서 사용할 수 있습니다 P1/S1.
  • 또는 에서만 cmd1사용할 수 있습니다 .P1P1/S2
  • P2둘 다 또는 에서 사용할 수 없습니다 .P2/S3

일반적으로 나는 이것이 모든 디렉토리 구조에서 작동하기를 원합니다. 이는 git 저장소에 있는지 git이 감지하는 방법과 유사합니다. ./mybin, ../mybin, ../../mybin을 붙이는 것과 같습니다 $PATH.

PATH이것이 작동하도록 어떻게 수정해야 합니까 ? 저는 물고기 껍질을 사용하고 있지만 다른 껍질의 솔루션을 제게 기꺼이 이식하겠습니다.

답변1

나는 당신이 단지 만족스럽지 않다는 것을 이해합니다

PATH="./mybin:../mybin:../../mybin:../../../mybin:$PATH"

8개 정도의 하위 디렉터리와 같은 일부 제한이 있을 때까지.

일반 명령 조회를 오염시키고 중단하는 대신, 접두사가 붙은 명령에 대해서만 재귀 조회가 수행되도록 짧은 래퍼를 사용하는 것이 좋습니다.

예. , 등을 k foo시도 하지만 평소처럼 에서 검색됩니다 ../mybin/foo../mybin/foofoo$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

관련 정보