9

perlでバッククォートを使用すると、コマンドがbashではなくshを使用して実行されるため、問題が発生することに気付きました。

perlがbashを使用するように、その動作を変更するにはどうすればよいですか?

PS。私が実行しようとしているコマンドは次のとおりです。

paste filename <(cut -d \" \" -f 2 filename2 | grep -v mean) >> filename3
4

6 に答える 6

8

「システムシェル」は一般的に変更可能ではありません。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`;
于 2010-07-30T18:00:19.040 に答える
8

試す

`bash -c \"your command with args\"`

-cの引数は、bashがコマンドラインを解釈する方法で解釈されると確信しています。秘訣はそれを保護することですsh-それが引用符の目的です。

于 2010-07-30T18:16:52.433 に答える
5

この例は私のために働きます:

$ perl -e 'print `/bin/bash -c "echo <(pwd)"`'
/dev/fd/63
于 2010-07-30T18:16:18.660 に答える
1

bashとネストされた引用符の実行に対処するために、この記事は最良の解決策を提供します:Perlのsystem()でbash構文を使用するにはどうすればよいですか?

my @args = ( "bash", "-c", "diff <(ls -l) <(ls -al)" );
system(@args);
于 2014-12-09T20:30:45.620 に答える
0

perl変数を尊重すると思いましたが、その動作は実際にはシステムの実装$SHELLに依存する可能性があることに気付きました。exec私の場合、exec

ファイルのパスを最初の引数としてシェル(/ bin / sh)を実行します。

あなたはいつでもできqw/bash your-command/ますね

于 2010-07-30T18:00:56.607 に答える
0

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);
于 2013-09-05T01:36:58.253 に答える