aka readpipe
attendent contre-apostrophes une commande passée à sh
(ou cmd
sous Windows). Vous semblez avoir une commande bash
plutôt qu'une commande sh
. Correction:
`bash -c 'datamash -ft, -g 1 mean 3 mean 4 < <(tail -n +2 yourfile | sort -t, -k1,2) | cut -d, -f1,2,5,6'`
Si vous aviez vars interpoler, il ressemblerait
use String::ShellQuote (shell_quote);
my $qfn = '...';
my $tail_cmd = shell_quote('tail', '-n', '+2', $qfn);
my $bash_cmd = "datamash -ft, -g 1 mean 3 mean 4 < <($tail_cmd | sort -t, -k1,2) | cut -d, -f1,2,5,6";
my $sh_cmd = shell_quote('bash', '-c', $bash_cmd);
`$sh_cmd`
Comme @chepner remarqué, la commande bash
peut être convertie en une commande plus simple qui est compatible avec sh
. Cela réduit le premier extrait à ce qui suit:
`tail -n +2 yourfile | sort -t, -k1,2 | datamash -ft, -g 1 mean 3 mean 4 | cut -d, -f1,2,5,6'`
Cela ne contribue pas nous éloigner de l'utilisation shell_quote
dans le second extrait, mais il ne le réduire des documents suivants:
use String::ShellQuote (shell_quote);
my $qfn = '...';
my $tail_cmd = shell_quote('tail', '-n', '+2', $qfn);
my $sh_cmd = "$tail_cmd | sort -t, -k1,2 | datamash -ft, -g 1 mean 3 mean 4 | cut -d, -f1,2,5,6";
`$sh_cmd`
Les quatre seuls caractères spéciaux dans les littéraux de chaîne entre guillemets (y compris les guillemets) sont: '' '', '$', '@' et le (s) délimiteur (s). – ikegami