문자열을 가져와서 .csh 스크립트에 전달하는 Perl 스크립트를 작성 중입니다.
PerlScript.pl:
$CMDLineArgs = "-stuff -more_stuff \'-even_more \"*stuff\" -last_stuff\'";
system(Script.csh $CMDLineArgs);
스크립트.csh:
set flags="$argv[*]"
어떤 이유로 작은 따옴표가 내 .csh 스크립트에 포함되지 않으며 *가 문자열의 아무 곳에나 있으면 모든 것이 작동하지 않습니다. Perl 스크립트에 나타나는 문자열을 csh 스크립트에 정확하게 넣는 방법에 대한 제안 사항이 있습니까?
답변1
Perl
quote
직면하고 있는 상황에 사용할 수 있는 다양한 -ing 연산자가 있습니다. 특히 qw//
, qq//
, 연산자는 각각 , , 연산자를 q//
나타냅니다 . 데이터를 참조하는 번거로움이 완전히 제거되었음을 알 수 있습니다.quote word
double quote string
single quote string
이미 지적했듯이 보안상의 이유로 system()
in 대신 a를 통해 제공되는 인수를 사용하면 명령이 더 잘 제공됩니다.list
scalars
마지막으로 cshell
코드 내에서 :q
수정자를 사용하여 변수를 참조해야 합니다.
% cat PerlScript.pl
my @Args = (
qw/ -stuff /, # whitespace ignored
qw/ -more_stuff /, # whitespace ignored
q['-even more "*stuff" -last_stuff'], # whitespace IMPORTANT
);
my $csh_script = q[Script.csh];
system($csh_script, @Args) and
die qq[Error: The script $csh_script has failed with exit code:], $? >> 8;
% cat Script.csh
foreach arg ( $argv[*]:q )
echo "<$arg>"
end
결과
<-stuff>
<-more_stuff>
<'-even more "*stuff" -last_stuff'>
노트
- 출력이 마음에 들지 않는다고 생각되면 csh 스크립트에서 아무것도 변경하지 마십시오. 대신
@Args
PerlScript.pl 파일에서 작업하십시오. @Args
예를 들어 다음과 같이 채우려는 경우 :
my @Args = (
qw/ -stuff /,
qw/ -more_stuff /,
q['-even more],
q["*stuff"],
q[-last_stuff'],
#q['-even more "*stuff" -last_stuff'],
);
그러면 다음과 같은 결과가 표시됩니다.
<-stuff>
<-more_stuff>
<'-even more>
<"*stuff">
<-last_stuff'>
답변2
이를 수행하는 다른 방법이 있을 수 있습니다(저는 csh/tcsh에 대한 전문가가 아닙니다. 90년대 초반에 csh를 사용해야 했을 때 csh를 좋아하지 않았고 그 이후로 가능한 한 많이 사용하지 않았습니다). tcsh에서 원하는 것을 수행하기 위해 내가 찾은 유일한 방법은 set nonomatch
또는 를 사용하는 것입니다 set noglob
. 예를 들어:
perlscript.pl:
#!/usr/bin/perl
@CMDLineArgs = ('-stuff', '-more_stuff', '-even_more', '*stuff', '-last_stuff');
system('./script.tcsh', @CMDLineArgs);
또는 작은따옴표와 쉼표를 모두 입력하지 않으려면 다음을 사용하세요 qw()
.
@CMDLineArgs = qw(-stuff -more_stuff -even_more *stuff -last_stuff);
script.tcsh:
#!/bin/tcsh
set nonomatch
set flags=($argv[*])
foreach f ($flags)
echo $f
end
출력은 다음과 같습니다
$ ./perlscript.pl
-stuff
-more_stuff
-even_more
*stuff
-last_stuff
$flags
이것이 각 매개변수 를 모두 단일 문자열로 연결하는 대신 에서 별도의 요소로 유지하는 방법에 유의하세요 .