결과

결과

문자열을 가져와서 .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

Perlquote직면하고 있는 상황에 사용할 수 있는 다양한 -ing 연산자가 있습니다. 특히 qw//, qq//, 연산자는 각각 , , 연산자를 q//나타냅니다 . 데이터를 참조하는 번거로움이 완전히 제거되었음을 알 수 있습니다.quote worddouble quote stringsingle quote string

이미 지적했듯이 보안상의 이유로 system()in 대신 a를 통해 제공되는 인수를 사용하면 명령이 더 잘 제공됩니다.listscalars

마지막으로 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 스크립트에서 아무것도 변경하지 마십시오. 대신 @ArgsPerlScript.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이것이 각 매개변수 를 모두 단일 문자열로 연결하는 대신 에서 별도의 요소로 유지하는 방법에 유의하세요 .

관련 정보