prosource

셸 와일드카드 문자 확장을 중지하시겠습니까?

probook 2023. 4. 18. 23:05
반응형

셸 와일드카드 문자 확장을 중지하시겠습니까?

컴파일된 명령줄 프로그램에서 파라미터의 와일드카드 문자를 전개하지 않도록 bash 또는 csh에 통지할 수 있는 방법이 있습니까?

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

foo *

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

아니요. 확장은 명령이 실제로 실행되기 전에 수행됩니다.
글로벌 디세블로 할 수 있는 것은 명령어를 실행하기 전 또는 별 따옴표를 사용하여 한정됩니다.

$ # 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

명령어 자체는 글로벌화를 끌 수 없지만 사용자가 Unix 쉘에 특정 명령어를 글로벌화하지 않도록 지시할 수 있습니다.이 작업은 보통 셸의 구성 파일을 편집하여 수행합니다.명령어 가정foo는 명령어 패스에 따라 찾을 수 있습니다.다음 항목을 적절한 Configuration파일에 추가해야 합니다.

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']

언급URL : https://stackoverflow.com/questions/11456403/stop-shell-wildcard-character-expansion

반응형