echo "${PATH}" | tr -s ':' '\n' | nl
Bash 스크립트 내부와 터미널에서 입력 하면 동일한 결과가 나타납니다.
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
type
bashscript 내부와 터미널의 출력이 다른 이유는 무엇입니까 ? bash 스크립트 type
출력을 터미널 출력과 동일하게 만들려면 어떻게 해야 합니까?
답변1
type
별칭이 지정된 것 같습니다 type -a
. 터미널에서 실행되는 모든 셸 스크립트는 별칭을 상속하지 않으며 스크립트는 기본적으로 비대화형 모드로 실행됩니다.
스크립트는 비대화형 쉘에서 실행되기 때문에 ~/.bashrc
bash는 스크립트가 실행될 때 스크립트를 선택하지 않으므로 거기에 정의된 별칭이 로드되지 않습니다.
아니 -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
type
bash의 (비대화형) 인스턴스에서 실행하면 별칭이 상속되지 않습니다.
$ 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.