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

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


답변