
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
이것이 작동하도록 어떻게 수정해야 합니까 ? 저는 물고기 껍질을 사용하고 있지만 다른 껍질의 솔루션을 제게 기꺼이 이식하겠습니다.
답변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