Bash 스크립트의 'type' 명령이 모든 경로를 표시하지 않음

Bash 스크립트의 'type' 명령이 모든 경로를 표시하지 않음

echo "${PATH}" | tr -s ':' '\n' | nlBash 스크립트 내부와 터미널에서 입력 하면 동일한 결과가 나타납니다.

     1  /home/nikhil/Documents/Git/Cs/Architecture/bin
     2  /home/nikhil/.local/bin
     3  /home/nikhil/opt/.nvm/versions/node/v16.13.0/bin
     4  /home/nikhil/opt/bin
     5  /usr/local/sbin
     6  /usr/local/bin
     7  /usr/sbin
     8  /usr/bin
     9  /sbin
    10  /bin
    11  /usr/games
    12  /usr/local/games
    13  /snap/bin
    14  /home/linuxbrew/.linuxbrew/bin
    15  /home/linuxbrew/.linuxbrew/sbin
    16  /home/nikhil/.cargo/bin
    17  /home/nikhil/.cabal/bin
    18  /home/nikhil/opt/go/bin
    19  /home/nikhil/.ruby/bin
    20  /home/linuxbrew/.linuxbrew/opt/fzf/bin

그러나 bash 스크립트와 터미널에 다음을 입력하면 다른 결과가 나타납니다.

# From Terminmal
$ type pandoc
pandoc is aliased to `/usr/bin/pandoc'
pandoc is /usr/bin/pandoc
pandoc is /home/linuxbrew/.linuxbrew/bin/pandoc
pandoc is /home/nikhil/.cabal/bin/pandoc
# From inside bash script
pandoc is /usr/bin/pandoc

typebashscript 내부와 터미널의 출력이 다른 이유는 무엇입니까 ? bash 스크립트 type출력을 터미널 출력과 동일하게 만들려면 어떻게 해야 합니까?

답변1

type별칭이 지정된 것 같습니다 type -a. 터미널에서 실행되는 모든 셸 스크립트는 별칭을 상속하지 않으며 스크립트는 기본적으로 비대화형 모드로 실행됩니다.

스크립트는 비대화형 쉘에서 실행되기 때문에 ~/.bashrcbash는 스크립트가 실행될 때 스크립트를 선택하지 않으므로 거기에 정의된 별칭이 로드되지 않습니다.

아니 -a, type그럴 거야"명령 이름으로 사용되는 경우 해석 방법을 나타냅니다."- 즉, 실제로 실행 중인 내용이 표시됩니다. 사용 -a하면 가능한 모든 일치 항목이 표시됩니다(실행 파일 $PATH(직접 및 아래 심볼릭 링크를 통해), 별칭, 함수)

예를 들어 내 시스템의 grep별칭은 다음과 같습니다.

$ type grep
grep is aliased to `grep --directories=skip --binary-files=without-match'

$ type -a grep
grep is aliased to `grep --directories=skip --binary-files=without-match'
grep is /bin/grep

$ type -P grep
/bin/grep

typebash의 (비대화형) 인스턴스에서 실행하면 별칭이 상속되지 않습니다.

$ bash -c 'type grep'
grep is /bin/grep

bash를 대화형 모드로 강제 실행하면 실행됩니다 source ~/.bashrc(결과적으로 내 ~/.bash-aliases파일을 가져옵니다).

$ bash -i -c 'type grep'
grep is aliased to `grep --directories=skip --binary-files=without-match'

참고: 스크립트를 인터프리터로 사용하는 것은 좋은 생각이 아닙니다 bash -i. 대신 스크립트 자체 내에서 스크립트에 필요한 별칭이나 함수를 정의하거나 다른 파일에서 가져옵니다. 아니면 스크립트에 필요한 모든 옵션과 함께 해당 명령을 사용하세요. 별칭은 스크립트에 실제로 필요하지 않은 반복적인 입력을 줄이는 데 유용합니다. 그런데 type옵션 -P은 일반적으로 스크립트에서 가장 유용한 옵션입니다.

바라보다 help type:

type: type [-afptP] name [name ...]

Display information about command type.

For each NAME, indicate how it would be interpreted if used as a
command name.

Options:
  -a        display all locations containing an executable named NAME;
            includes aliases, builtins, and functions, if and only if
            the `-p` option is not also used

  -f        suppress shell function lookup

  -P        force a PATH search for each NAME, even if it is an alias,
            builtin, or function, and returns the name of the disk file
            that would be executed

  -p        returns either the name of the disk file that would be executed,
            or nothing if `type -t NAME` would not return `file`

  -t        output a single word which is one of `alias`, `keyword`,
            `function`, `builtin`, `file` or ``, if NAME is an alias,
            shell reserved word, shell function, shell builtin, disk file,
            or not found, respectively

Arguments:
  NAME      Command name to be interpreted.

Exit Status:
Returns success if all of the NAMEs are found; fails if any are not found.

관련 정보