TCSH:TCSHスクリプトでperl -eを使用すると「文字列ターミネータが見つかりません」エラーが発生する

TCSH:TCSHスクリプトでperl -eを使用すると「文字列ターミネータが見つかりません」エラーが発生する

tcshスクリプトはこのエラーを表示しますが、理由を理解できません。

スクリプト:

#!/usr/bin/env tcsh
foreach n (0 1)
  set PERL_CMD = "perl -e 'print qq^RUNNING^; exit ${n} '"
  echo "PERL_CMD:\n${PERL_CMD}"
  ${PERL_CMD}
  echo
end

結果:

[]$ ./test_perl_e.csh
PERL_CMD:
perl -e 'print qq^RUNNING^; exit 0 '
Can't find string terminator "'" anywhere before EOF at -e line 1.

PERL_CMD:
perl -e 'print qq^RUNNING^; exit 1 '
Can't find string terminator "'" anywhere before EOF at -e line 1.

コマンドラインからPERL_CMDを実行すると正常に動作します。

[]$ perl -e 'print qq^RUNNING^; exit 1 '
RUNNING[]$ 

tcshスクリプトを挿入すると正常にエコーされます。ところで実行しようとすると割れます。

私は多くのバリエーションを試しましたが、パニックになりました。私は何が間違っていましたか?


Perl/5.24を使う

[]$ perl -v
This is perl 5, version 24, subversion 0 (v5.24.0) built for x86_64-linux

ベストアンサー1

cshellで望ましい慣用的な方法は、a)配列を使用し、b)正しい参照演算子を使用することです。で読むことができますman tcsh

#!/usr/bin/env tcsh
set perl = "perl"

set options = ( -w -l )

foreach n (0 9)
  set cmd = "\
    print qq/running/;\
    exit($n); \
  "

  "${perl}" \
    ${options[*]:x} \
    -e ${cmd:q}  \
  ;

  echo ""
end 

おすすめ記事