perlでバッククォートを使用すると、コマンドがbashではなくshを使用して実行されるため、問題が発生することに気付きました。
perlがbashを使用するように、その動作を変更するにはどうすればよいですか?
PS。私が実行しようとしているコマンドは次のとおりです。
paste filename <(cut -d \" \" -f 2 filename2 | grep -v mean) >> filename3
「システムシェル」は一般的に変更可能ではありません。perldoc-fexecを参照してください。
LISTに複数の引数がある場合、またはLISTが複数の値を持つ配列である場合は、LISTの引数を使用してexecvp(3)を呼び出します。スカラー引数が1つしかない場合、または要素が1つある配列の場合は、引数のシェルメタ文字がチェックされ、存在する場合は、引数全体がシステムのコマンドシェルに渡されて解析されます(これは「/ bin / sh」です)。 Unixプラットフォームでは-c"ですが、他のプラットフォームでは異なります)。
特定のタスクを実行するためにbashが本当に必要な場合は、明示的に呼び出すことを検討してください。
my $result = `/usr/bin/bash command arguments`;
あるいは:
open my $bash_handle, '| /usr/bin/bash' or die "Cannot open bash: $!";
print $bash_handle 'command arguments';
bashコマンドを.shファイルに入れて、それを直接呼び出すこともできます。
my $result = `/usr/bin/bash script.pl`;
試す
`bash -c \"your command with args\"`
-cの引数は、bashがコマンドラインを解釈する方法で解釈されると確信しています。秘訣はそれを保護することですsh
-それが引用符の目的です。
この例は私のために働きます:
$ perl -e 'print `/bin/bash -c "echo <(pwd)"`'
/dev/fd/63
bashとネストされた引用符の実行に対処するために、この記事は最良の解決策を提供します:Perlのsystem()でbash構文を使用するにはどうすればよいですか?
my @args = ( "bash", "-c", "diff <(ls -l) <(ls -al)" );
system(@args);
perl
変数を尊重すると思いましたが、その動作は実際にはシステムの実装$SHELL
に依存する可能性があることに気付きました。exec
私の場合、exec
ファイルのパスを最初の引数としてシェル(/ bin / sh)を実行します。
あなたはいつでもできqw/bash your-command/
ますね
perlサブルーチンを作成します。
sub bash { return `cat << 'EOF' | /bin/bash\n$_[0]\nEOF\n`; }
そして、以下のように使用します。
my $bash_cmd = 'paste filename <(cut -d " " -f 2 filename2 | grep -v mean) >> filename3';
print &bash($bash_cmd);
または、複数行のコマンドにはperlhere-docを使用します。
$bash_cmd = <<'EOF';
for (( i = 0; i < 10; i++ )); do
echo "${i}"
done
EOF
print &bash($bash_cmd);