Passando em caracteres especiais de um script perl para csh

0

Estou escrevendo um script perl que pega uma string e a transmite em um script .csh.

PerlScript.pl:

$CMDLineArgs = "-stuff -more_stuff \'-even_more \"*stuff\" -last_stuff\'";
system(Script.csh $CMDLineArgs);

Script.csh:

set flags="$argv[*]"

Por alguma razão, as aspas simples não estão fazendo isso no meu script .csh, e a coisa toda não funcionará se * estiver em qualquer lugar da string. Alguma sugestão sobre como posso obter a string exatamente como aparece no script perl no script csh?

    
por zebramints 27.07.2017 / 02:44

2 respostas

0

Pode haver outras maneiras de fazer isso (não sou especialista em csh / tcsh - não gostei do csh quando tive que usá-lo no início dos anos 90 e o evitei o máximo possível desde então), mas a única maneira Eu encontrei para fazer o que você quer no tcsh é com set nonomatch ou set noglob . Por exemplo:

perlscript.pl:

#!/usr/bin/perl

@CMDLineArgs = ('-stuff', '-more_stuff', '-even_more', '*stuff', '-last_stuff');
system('./script.tcsh', @CMDLineArgs);

alternativamente, se você não quiser digitar todas as aspas simples e vírgulas, use 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

e a saída é:

$ ./perlscript.pl
-stuff
-more_stuff
-even_more
*stuff
-last_stuff

Observe como isso mantém cada argumento como um elemento separado em $flags , em vez de concatená-los em uma única string.

    
por 27.07.2017 / 07:03
2

Perl fornece uma variedade de operadores quote -ing para apenas um cenário como você parece estar tendo. Em particular, os operadores qw// , qq// e q// , representando os operadores quote word , double quote string e single quote string , respectivamente. Você notará que eles tiram completamente o trabalho penoso citando dados.

E, como já foi apontado, o comando system() é melhor servido usando argumentos veiculados por meio de list em vez de scalars por motivos de segurança.

Por fim, dentro do código cshell , você precisa usar o modificador :q para citar a variável.

%  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

Resultados

<-stuff>
<-more_stuff>
<'-even more "*stuff" -last_stuff'>

Notas

  • Se você não acha que a saída é do seu agrado, então NÃO mude nada no script csh. Em vez disso, jogue com @Args no arquivo PerlScript.pl.
  • Por exemplo, se você fosse preencher o @Args como mostrado:
my @Args = (
   qw/     -stuff  /,
   qw/ -more_stuff /,
   q['-even more],
   q["*stuff"],
   q[-last_stuff'],
   #q['-even more "*stuff" -last_stuff'],
);

Então você veria o seguinte resultado:

<-stuff>
<-more_stuff>
<'-even more>
<"*stuff">
<-last_stuff'>
    
por 27.07.2017 / 08:31