2017-08-03 4 views
1

J'ai une commande système que je suis en train d'exécuter, mais il me donne l'erreur « Erreur de syntaxe: redirection inattendue »comment échapper à la <<() idiome en Perl

commande Essayer:

datamash -ft, -g 1 mean 3 mean 4 < <(tail -n +2 yourfile | sort -t, -k1,2) | cut -d, -f1,2,5,6 

J'ai essayé le readpipe et ai également échappé le < avec \ < \ <, mais ne fonctionne pas.

ci-dessous commande ne fonctionne pas ==>

`datamash -ft, -g 1 mean 3 mean 4 \< \<(tail -n +2 yourfile | sort -t, -k1,2) | cut -d, -f1,2,5,6` 
+0

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

Répondre

2

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` 
+0

merci ikegami..it travaillé pour moi – ran1n

3

I wouldn pas même la peine d'utiliser la substitution de processus ici. Il suffit d'utiliser un pipeline ordinaire:

`tail -n +2 yourfile | sort -t, -k1,2 | datamash -ft, -g 1 mean 3 mean | cut -d, -f1,2,5,6` 

La substitution de processus est le plus utile lorsqu'une commande (comme datamash) doit fonctionner dans le shell en cours, ou lorsque vous voulez alimenter la sortie d'une commande à une autre commande qui lit seulement à partir d'un fichier nommé, pas son entrée standard. Aucun cas ne s'applique ici.