쉘 스크립트를 사용하여 덮어쓸 때 원래 명령을 찾는 경로는 무엇입니까?

쉘 스크립트를 사용하여 덮어쓸 때 원래 명령을 찾는 경로는 무엇입니까?

저는 다른 명령의 실행을 래핑하기 위해 래퍼 스크립트를 작성하고 있습니다. 이 경우에는 Chef kitchen명령입니다. bash에서 실행하면 래퍼 스크립트가 실행되도록 내 스크립트도 호출되어 kitchen미리 배치 됩니다.$PATHkitchen

문제는 원본 버전을 어떻게 호출할 것인가입니다 kitchen. 물론 가장 확실한 방법은 전체 경로를 제공하는 것입니다. /usr/bin/kitchen스크립트에 경로를 입력하기만 하면 되지만, 다른 사람들이 다른 경로에 설치할 수도 있습니다. 물론, 이는 다른 래퍼 스크립트를 제외합니다. 솔루션이 스택 가능하다면 좋을 것입니다.

나는 동일한 주제를 다루는 두 가지 접근 방식을 생각했습니다.

  1. 스크립트에서 $PATH각 항목을 비교하여 장치 번호와 inode 번호를 $(dirname "$0")사용하여 동일한 디렉터리인지 확인합니다. stat그렇다면 그것을 제거하십시오 $PATH. 그런 다음 kitchen래퍼 스크립트를 다시 호출하면 안 되므로 호출할 수 있습니다 .
  2. #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

관련 정보