관련 내용에 더 자세한 내용을 추가하려고 할 때질문, 나는 사용할 수 있는 Bash 단어 유형 중 어떤 것을 실행할지 지정하는 방법을 모른다는 것을 깨달았습니다. help type
단어 유형 에 따라 다섯 가지 유형이 있습니다.
- 별명
- 핵심 단어
- 기능
- 내장
- 문서
단어에는 여러 유형이 있을 수 있습니다( true
이는 단지 예일 뿐이며 더 일반적으로 포함되는 단어는 다음과 같습니다 cd
).
$ type -a true
true is a shell builtin
true is /bin/true
특정 동의어를 적용하는 방법은 무엇입니까?지금까지는 선호도 순으로 다음과 같습니다.
별칭: 이는 다른 모든 동의어보다 우선순위가 높기 때문에 특별한 경우입니다. 이를 시행하는 것은 별칭이 정의되지 않았고 명령이 실패한 경우에만 유용합니다.
$
핵심 단어:
$
기능:
$
내장:
$ builtin true
문서:
$ command true $ $(which true) $ /bin/true
인용된 단어에는 별칭과 키워드가 포함되지 않습니다. 그건,
$ 'true'
함수, 내장 함수 또는 파일만 실행됩니다.
답변1
질문하신 내용은 사실 별 의미가 없습니다.
핵심 단어쉘 구문의 일부임을 의미하는 단어입니다. 이는 토큰화를 통해 식별됩니다. 이를 인용하면 쉘이 이를 인식하지 못하게 됩니다.
그러나 대부분의 셸에서는 키워드에 별칭을 지정할 수 있습니다. 따라서 별칭은 키워드보다 우선합니다(실제로는 일찍 확장되고 나중에 더 많은 토큰화가 이루어지며 더 많은 별칭, 키워드를 가질 수 있습니다)...
별칭(명령 위치에서만 확장되는 zsh에 의해 정의된 별칭 제외 alias -g
)이므로 일반적으로 builtin the-alias
.
함수는 외부 명령보다 우선하는 내장 명령보다 우선합니다(그런 다음 $PATH
사용할 명령을 결정합니다).
다음을 사용하여 내장을 강제할 수 있습니다.
builtin the-cmd and its args
(단, 표준 명령은 아니라는 점에 유의해야 합니다.)
별칭을 인용하여 비활성화할 수 있습니다(일부 쉘에서는 인용된 버전을 별칭으로 사용할 수도 있음).
예를 들어(여기서는 zsh 구문) 다음과 같습니다.
'while'() echo function while
alias 'while=echo alias while'
while true
실제로 출력을 쓰면 별칭과 키워드가 모두 비활성화되므로 키워드를 사용할 수 없습니다 alias while true
.while
while
예를 들어 다음을 사용하여 함수를 호출할 수 있습니다.
'whi'le whatever
내장 함수 가 있는 경우 while
(물론 while
키워드가 있는 쉘에는 포함되지 않음) 다음과 같이 작성할 수 있습니다.
builtin while whatever
명령 을 호출하려면 while
다음을 작성합니다.
env while whatever
또는 zsh
( sh
시뮬레이션이 아닌 경우):
command while whatever
(다른 쉘에서는 command
내장 기능이 아닌 기능만 차단됩니다.)
또는
/full/path/to/while whatever
물론, 다음과 같은 멍청한 일을 하는 것을 막을 수 있는 방법은 없습니다.
alias 'while=while "w"hile; do'
"while"() { while "whi"le; done; }
적어도 zsh에서는 이것이 작동합니다(그러나 어리석습니다).
답변2
나에게 매우 유용한 관용구는 다음과 같습니다:
FALSE=1; TRUE=0
DEVEL_FLAG=$FALSE
...
in_development() { return $DEVEL_FLAG ; }
cd()
{
if in_development ; then # -D argument to script toggles development flag
echo "Would run cd $*"
else
builtin cd "$@"
fi
}
이제 -D를 지정하는 스크립트를 실행하면 개발 모드가 활성화되고 cd(또는 다른 래퍼 명령)가 디버그 정보를 에코합니다.
이는 ssh를 실행하는 스크립트에 특히 유용합니다. 물론 set -x를 전환할 수도 있지만 이것이 더 유용하고 읽기 쉽습니다.