Bash 단어가 별칭, 함수, 파일 등을 참조하도록 강제하는 방법은 무엇입니까?

Bash 단어가 별칭, 함수, 파일 등을 참조하도록 강제하는 방법은 무엇입니까?

관련 내용에 더 자세한 내용을 추가하려고 할 때질문, 나는 사용할 수 있는 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를 전환할 수도 있지만 이것이 더 유용하고 읽기 쉽습니다.

관련 정보