관련 질문에 좀 더 자세한 내용을 추가하려고 할 때 사용할 수있는 Bash 단어 유형 중 하나를 지정하는 방법을 모른다는 것을 깨달았습니다. 에 따르면 help type
다섯 개 단어의 유형이있다 :
- 별명
- 예어
- 함수
- 내장
- 파일
단어에 여러 유형이있을 수 있습니다 ( true
단지 예일뿐입니다.보다 일반적으로 재정의 된 단어는 cd
).
$ type -a true
true is a shell builtin
true is /bin/true
특정 동의어를 어떻게 강제 실행합니까? 지금까지 우선 순위에 따라 :
-
alias : 이것은 다른 모든 동의어보다 우선하기 때문에 특별한 경우입니다. 별명을 정의하지 않은 경우 명령이 실패해야하는 경우에만이 기능을 사용하십시오.
$
-
예어:
$
-
함수:
$
-
내장 :
$ builtin true
-
파일:
$ command true $ $(which true) $ /bin/true
부분 솔루션 :
-
단어를 인용하면 별칭과 키워드가 제외됩니다. 그건,
$ 'true'
함수, 내장 또는 파일 만 실행합니다.
답변
당신이 묻는 것은 실제로 의미가 없습니다.
키워드 는 쉘 구문의 일부인 단어를 의미합니다. 그것들은 토큰 화를 통해 인식됩니다. 그것들을 인용하면 쉘이 인식을 멈추기에 충분합니다.
그래도 대부분의 쉘에서 키워드의 별칭을 지정할 수 있습니다. 따라서 별칭이 키워드보다 우선합니다 (사실상 확장되고 더 많은 별칭, 키워드를 가질 수있는 이후 토큰 화가 더 많이 발생 함).
별명 (으로 정의 된 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에서는 유효하지만 어리 석습니다.
답변
나에게 매우 유용한 관용구는 다음과 같습니다.
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를 실행하는 스크립트에서 특히 유용합니다. 물론 세트 -x를 토글 할 수는 있지만 이것은 더 유용하고 읽기 쉽습니다.