http://www.perlmonks.org?node_id=1061510


in reply to IPC::Run / bash pipe

What is '<<<' supposed to be?

Also, I'm not sure what you're trying to accomplish with the quoting, but I don't think you're doing it correctly. If you have the input for your command in a string, then just use it:
use IPC::Run qw(run); my @arr = qw( abc def ); my $input = join("", map "$_\n", @arr); run [ sed => 's/[ad]/o/' ], "<", \$input, ">", \my $output; print "O: [$output]\n";

Or compare these various quoting strategies (the first is similar to yours and I believe incorrect, the last is more like what I think you're trying to accomplish):

use IPC::Run qw(run); my @arr = qw( abc def ); run [ echo => q(') => join("\n", @arr) => q(') ], ">", \my $output; print "O: [$output]\n"; run [ echo => q(') . join("\n", @arr) . q(') ], ">", \my $output; print "O: [$output]\n"; run [ echo => join("\n", @arr) ], ">", \my $output; print "O: [$output]\n";

Replies are listed 'Best First'.
Re^2: IPC::Run / bash pipe
by ag4ve (Monk) on Nov 07, 2013 at 01:53 UTC

    This is the syntax I'm going for:

    grep ba > t.txt 2>&1 <<< $(echo -e "foo\nbar\nbaz")

    To demonstrate what I'm Looking at:

    #!/usr/bin/env perl use strict; use warnings; use IPC::Run qw(run); my $str; my $count = 0; while (1) { $count += 10; $str .= "1111111111"; run [echo => $str], '|', [grep => 'foo']; print "$count " unless ($count % 10000) }

    And if you don't feel like waiting for it, here's the result:

    % ./t2.pl 10000 20000 30000 40000 50000 60000 70000 80000 90000 100000 110000 12 +0000 130000 exec failed: Argument list too long at ./t2.pl line 16. at ./t2.pl line 16.

    If I don't use ipset (which are pretty long by their own, I'm under the limit. However, without ipset:

    # wc -c fw2.save 165670 fw2.save

    I don't want to write a tempfile unless there's no other option, ulimit -s unlimited doesn't seem to make a difference, and I'm not sure about FFI::Raw and iptc.o / iptables.o (I'm looking into it).

      Oh, nm, I'm blind (or not paying attention) - that works

      my $success = run [$ipt_cmd => 'iptables-restore'], '<', \(join("\n". @iptout)), '>', \my $cmdout, '2>&1';