programing

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

nasanasas 2020. 11. 7. 10:10
반응형

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


컴파일 된 명령 행 프로그램이 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가 필요하지 않습니다.

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


The expansion is performed by the shell before your program is run. Your program has no clue as to whether expansion has occurred or not.

   set -o noglob

will switch off expansion in the invoking shell, but you'd have to do that before you invoke your program.

The alternative is to quote your arguments e.g.

foo "*"

Beware: if there are no names matching the mask, bash passes the argument as-is, without expansion!

Proof (pa.py is a very simple script, which just prints its arguments):

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

No. A Bourne-style shell always performs globbing when appropriate before executing the command. The user has to quote or escape the arguments to prevent globbing, like foo \*; the actual program being executed cannot indicate a preference.

참고URL : https://stackoverflow.com/questions/11456403/stop-shell-wildcard-character-expansion

반응형