$는 해석하지만 *는 해석하지 않는 코드를 어떻게 얻나요? [폐쇄]

$는 해석하지만 *는 해석하지 않는 코드를 어떻게 얻나요? [폐쇄]

나는 몇 가지 Perl 코드를 가지고 있습니다. (지금은 무엇을 하는지에 집중하지 마세요. 아직 작업 중입니다.)

#!/usr/bin/perl -w

if(!@ARGV)
{
  print ("ERROR: NO ARGS\n");
  exit 1;
}

else
{
  use Cwd qw(cwd);
  my $dir = cwd;

  print $ARGV[0];
  @allfiles = glob($ARGV[0]);

  foreach $file (@allfiles){
    print "$file\n";
  }
}

ARGV[0]의 내용은 라인에서 @allfiles = glob($ARGV[0]);해석됩니다 . 나는 그들이 그러기를 원하지 않습니다. 예를 들어 ARGV[0]이 *.txt인 경우 메타문자만 해석됩니다. 나는 그렇게 하고 싶지 않습니다. glob()에 대한 입력으로 "*.txt"를 사용하고 싶습니다. 어떻게 해야 합니까?

답변1

zsh셸을 통해 다음을 사용할 수 있습니다.

alias myscript='noglob myscript'

noglobmultios다음 단순 명령에 대한 인수에 와일드카드 문자가 표시되지 않도록 하는 쉘 키워드입니다(켜져 있으면 리디렉션이 발생하지 않습니다).

이 작업은 계속 수행할 수 있습니다.

ENV_VAR=value myscript args

또는

<input myscript args

아니면 간단히 사용할 수 있습니다

myscript "*.$ext"

확장 하고 싶지만 $ext글로브를 확장하지 않는 경우.

답변2

이 경우 함수 대신 bash 별칭을 사용하는 것이 좋습니다. Bash 매뉴얼에는 For almost every purpose, aliases are superseded by shell functions이것이 예외라고 나와 있습니다.

보통 이렇게 말하면

 perl script *.txt

그러면 쉘이 *.txt를 확장합니다. 이 기능은 "set +f"를 사용하여 끌 수 있습니다. 함수 사용의 문제점은 함수가 호출될 때 쉘이 패턴을 확장했기 때문에 별칭과 함수를 조합하여 사용하는 것이 요령입니다.

alias script="set +f ; _script"
_script(){ set -f ; perl script "$@" ; }

그런 다음 실행

 script *.txt

"set +f; _script *.txt"로 처리되므로 _script 함수를 호출하기 전에 모드 확장이 꺼집니다. 이 함수는 스키마 확장을 다시 연 다음 Perl 스크립트를 호출합니다.

이 문제를 피하는 또 다른 방법은 쉘 인용을 사용하고 다음과 같이 말하는 것입니다.

  perl script '*.txt'

그리고 따옴표는 쉘이 패턴 확장을 수행하는 것을 방지합니다.

관련 정보