컴파일 된 명령 줄 프로그램이 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
nullglob
이 비활성화 된 경우 단어는 변경되지 않은 상태로 유지됩니다. nullglob
옵션이 설정되어 있고 일치하는 항목이 없으면 단어가 제거됩니다."
set -f
? 그렇 unset -f
습니까?
set +f
명령 자체가 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 "*"
set -o noglob
와일드 카드 확장을 비활성화 하는 데 사용합니다.
주의 : 마스크와 일치하는 이름이 없으면 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']
set -o nullglob
또는 shopt -s failglob
이 동작이 변경됩니다 (매우 다른 두 가지 방식).
pwd
,echo *
그냥*