[bash] 쉘 와일드 카드 문자 확장을 중지 하시겠습니까?

컴파일 된 명령 줄 프로그램이 bash 또는 csh에 매개 변수의 와일드 카드 문자를 확장하지 않기를 원한다고 알리는 방법이 있습니까?

예를 들어 다음과 같은 쉘 명령이 필요할 수 있습니다.

foo *

해당 문자의 숫자 ASCII 값을 간단히 반환합니다.



답변

아니요. 명령이 실제로 실행되기 전에 확장이 발생합니다.
명령을 실행하거나 별표를 인용하여 glob을 비활성화 할 수 있습니다.

$ # quote it
$ foo '*'

$ # or escape it
$ foo \*

$ # or disable the glob (noglob)
$ set -f
$ foo *

$ # alternative to set -f
$ set -o noglob
$ # undo it by 
$ set +o noglob


답변

명령 자체가 globbing을 끌 수는 없지만 사용자가 특정 명령을 glob하지 않도록 Unix 셸에 지시 할 수 있습니다. 이것은 일반적으로 쉘의 구성 파일을 편집하여 수행됩니다. foo명령 경로를 따라 명령을 찾을 수 있다고 가정하면 적절한 구성 파일에 다음을 추가해야합니다.

sh, bash 및 ksh 쉘의 경우 :

alias foo='set -f;foo';foo(){ command foo "$@";set +f;}

csh 및 tcsh 쉘의 경우 :

alias foo 'set noglob;\foo \!*;unset noglob'

zsh 셸의 경우 :

alias foo='noglob foo'

명령 경로를 사용할 필요는 없습니다. foo 명령이 ~ / bin 디렉토리에 저장되어 있다고 가정하면 위의 내용은 다음과 같습니다.

sh, bash 및 ksh 쉘의 경우 :

alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;}

csh 및 tcsh 쉘의 경우 :

alias foo 'set noglob;$home/bin/foo \!*;unset noglob'

zsh 셸의 경우 :

alias foo='noglob ~/bin/foo'

위의 모든 것은 Apple의 OSX 10.9.2를 사용하여 테스트되었습니다. 참고 : 위 코드를 복사 할 때 공백을 삭제하지 않도록주의하십시오. 중요 할 수 있습니다.

최신 정보:

사용자 geira 는 bash 쉘의 경우

alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;}

대체 될 수있다

reset_expansion(){ CMD="$1";shift;$CMD "$@";set +f;}
alias foo='set -f;reset_expansion ~/bin/foo'

함수 foo가 필요하지 않습니다.

이 문서를 만드는 데 사용 된 일부 웹 사이트 :


답변

확장은 프로그램이 실행되기 전에 쉘에 의해 수행됩니다. 귀하의 프로그램은 확장이 발생했는지 여부에 대한 단서가 없습니다.

   set -o noglob

호출하는 셸에서 확장을 끄지 만 프로그램을 호출 하기 전에 해야합니다.

대안은 당신의 주장을 인용하는 것입니다.

foo "*"


답변

주의 : 마스크와 일치하는 이름이 없으면 bash는 확장없이 인수를 그대로 전달합니다!

Proof (pa.py는 인수를 인쇄하는 매우 간단한 스크립트입니다) :

 $ ls
f1.cc  f2.cc  pa.py
 $ ./pa.py *.cc
['./pa.py', 'f1.cc', 'f2.cc']
 $ ./pa.py *.cpp
['./pa.py', '*.cpp']


답변