![$는 해석하지만 *는 해석하지 않는 코드를 어떻게 얻나요? [폐쇄]](https://linux55.com/image/152408/%24%EB%8A%94%20%ED%95%B4%EC%84%9D%ED%95%98%EC%A7%80%EB%A7%8C%20*%EB%8A%94%20%ED%95%B4%EC%84%9D%ED%95%98%EC%A7%80%20%EC%95%8A%EB%8A%94%20%EC%BD%94%EB%93%9C%EB%A5%BC%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%EC%96%BB%EB%82%98%EC%9A%94%3F%20%5B%ED%8F%90%EC%87%84%5D.png)
나는 몇 가지 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'
noglob
multios
다음 단순 명령에 대한 인수에 와일드카드 문자가 표시되지 않도록 하는 쉘 키워드입니다(켜져 있으면 리디렉션이 발생하지 않습니다).
이 작업은 계속 수행할 수 있습니다.
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'
그리고 따옴표는 쉘이 패턴 확장을 수행하는 것을 방지합니다.