저는 다른 명령의 실행을 래핑하기 위해 래퍼 스크립트를 작성하고 있습니다. 이 경우에는 Chef kitchen
명령입니다. bash에서 실행하면 래퍼 스크립트가 실행되도록 내 스크립트도 호출되어 kitchen
미리 배치 됩니다.$PATH
kitchen
문제는 원본 버전을 어떻게 호출할 것인가입니다 kitchen
. 물론 가장 확실한 방법은 전체 경로를 제공하는 것입니다. /usr/bin/kitchen
스크립트에 경로를 입력하기만 하면 되지만, 다른 사람들이 다른 경로에 설치할 수도 있습니다. 물론, 이는 다른 래퍼 스크립트를 제외합니다. 솔루션이 스택 가능하다면 좋을 것입니다.
나는 동일한 주제를 다루는 두 가지 접근 방식을 생각했습니다.
- 스크립트에서
$PATH
각 항목을 비교하여 장치 번호와 inode 번호를$(dirname "$0")
사용하여 동일한 디렉터리인지 확인합니다.stat
그렇다면 그것을 제거하십시오$PATH
. 그런 다음kitchen
래퍼 스크립트를 다시 호출하면 안 되므로 호출할 수 있습니다 . - #1과 비슷하지만
$PATH
스크립트에서 수동으로 찾고stat
각 결과에 vs.를 사용합니다$0
. 자신을 찾을 때까지 계속 건너뛴 후 찾은 다음 항목을 사용합니다. 우리가 자신을 찾지 못하면 정상적으로 실행하십시오 (래퍼가 포함되어 있지 않지만$PATH
해당 경로를 제공하여 실행되는 경우를 처리하기 위해).
더 좋은 방법이 있나요? 아니면 이를 수행하는 코드가 일반적인 Debian 또는 Ubuntu Linux 시스템에 이미 존재합니까?
답변1
나는 과거에 비슷한 일을 몇 번 해본 적이 있는데, 내가 해야 할 일은 command kitchen
그것을 스크립트에서 사용하고 다른 이름을 지정한 my-kitchen
다음 별칭을 만드는 것뿐이었습니다.
alias kitchen=/path/to/my-kitchen
그러나 이것이 귀하의 사용 사례에 적합한지는 확실하지 않습니다.
답변2
별칭이 백슬래시로 이스케이프되어 셸에서 확장되는 것을 방지할 수 있습니다. command
또한 작동합니다.
kitchen
내 데스크탑에는 하나도 없기 때문에 별칭을 통해 pwd
설명 하겠습니다 uname -r
.
$ alias pwd='uname -r'
$ pwd
5.10.0-8-amd64
$ \pwd
/home/cas
$ command pwd
/home/cas
$ unalias pwd
$ pwd
/home/cas
답변3
kitchen
다음 작품 을 하고 싶은 것 같군요 $PATH
.
#!/bin/bash
me="$0"
foundit=""
for d in $( echo "$PATH" | tr ":" " " ) ; do
if [[ $foundit == "" ]] ; then
if [[ "$me" != "$d/kitchen" ]] ; then
if [[ -x "$d/kitchen" ]] ; then
foundit="$d/kitchen"
fi
fi
fi
done
# the next "kitchen" is in "`$foundit`"
# read `man bash`, about the `eval` and `exec` builtins