7
votes

Perl backticks: utilisez bash au lieu de sh

J'ai remarqué que lorsque j'utilise des backticks dans Perl, les commandes sont exécutées avec SH, pas bash, me donnant des problèmes.

Comment puis-je modifier ce comportement afin que Perl utilisera Bash?

PS . La commande que j'essaie de courir est la suivante: xxx


6 commentaires

Je suis assez certain que la réponse est "tu n'es pas".


Pourquoi? Quel est votre euphémisme?


sh est universel, bash n'est pas.


@ether: essayez perl -wle'print `echo foo; PS --Forest` ' pour voir sh .


BTW, la commande que j'essaie de courir est la suivante: Coller le nom de fichier <(Cut -D \ "\" -F 2 FileName2 | grep -v moyenne) >> nom_fichement3


Pourquoi êtes-vous même deborcer du tout? Vous pouvez faire ce que vous voulez de pure pur. Si vous souhaitez exécuter des objets dans la coquille, utilisez un script shell.


6 Réponses :


7
votes

La "coquille système" n'est généralement pas mutable. Voir Perldoc -f Exec :

S'il y a plus d'un argument dans la liste ou si la liste est une matrice avec plusieurs valeur, appelle Execvp (3) avec les arguments de la liste. Si il n'y a qu'un seul argument scalaire ou un tableau avec un élément de celui-ci, l'argument est vérifié pour les métacaracters Shell, et s'il y en a une L'argument entier est transmis à Shell de commande du système pour analyse (ceci est "/ bin / sh -c" sur des plates-formes UNIX, mais varie sur d'autres plates-formes). strong> p> blockQuote>

Si vous avez vraiment besoin d'une tâche particulière pour effectuer une tâche particulière, envisagez de l'appeler explicitement: p> xxx pré>

ou même: p> xxx

Vous pouvez également mettre vos commandes Bash dans un fichier .sh et appeler directement: P>

my $result = `/usr/bin/bash script.pl`;


2 commentaires

Je ne peux toujours pas obtenir le comportement attendu. La raison pour laquelle je voulais Bash, c'est que je exécute une commande AC en utilisant <(grep ...) et il semble que sh ne le supporte pas (mais Bash fait). Si j'exécute ma commande en tant qu'utilisateur, directement de bash cela fonctionne bien. Si je l'exécute de Perl dans des backtsticks, sh Shouts "SH: Erreur de syntaxe:" ("inattendu", si je l'exécute en backticks précédé de / usr / bin / bash, j'ai toujours la même chose de sh.


@David: Je ne comprends pas bien quelle commande vous essayez de courir; Pouvez-vous modifier cela dans votre question avec le formatage du code?



0
votes

Je pensais perl honorerait la variable $ coquille , mais cela m'a eu lieu que son comportement pourrait en réalité dépendre du exécuté de votre système la mise en oeuvre. Dans le mien, il semble que exec

exécutera la coquille (/ bin / sh) avec le chemin du fichier comme premier argument.

Vous pouvez toujours faire qw / bash votre-commande / , non?


1 commentaires

Je reçois toujours "SH: Erreur de syntaxe:" ("inattendu". Voir un commentaire sur le message d'origine pour la commande que j'essaie de courir.



5
votes

Cet exemple fonctionne pour moi:

$ perl -e 'print `/bin/bash -c "echo <(pwd)"`'
/dev/fd/63


0 commentaires

7
votes

ESSAYEZ

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


8 commentaires

Maintenant, je reçois des erreurs comme -f 1 / TMP / fichier | grep -v moyenne) >> / TMP / fichier2: -c: ligne 0: EOF inattendu en recherchant une correspondance `) '-F 1 / TMP / Fichier3 | grep -v moyenne) >> / tmp / fichier4: -c: ligne 1: erreur de syntaxe: extrémité inattendue de fichier


Peut être \ ne sont pas nécessaires dans mon exemple. En outre, n'utilisez pas "à l'intérieur de votre commande - utilisation '.


Résolu! La seule chose qui a fonctionné pour moi était: `bash -c 'my_command'`


Vous pouvez également évader de cibler des problèmes en utilisant ouvrir mon $ FH, '- |', qw (bash -c), $ cmdline qui est à peu près garanti de fonctionner exactement comme `$ cmdline` - mais L'interface est différente.


Ces \ sont inutiles et feraient beaucoup plus de sens d'utiliser des guillemets simples que les guillemets.


@ikegami Sûr, des citations simples pourraient être utilisées et seraient meilleures. Mais si elles sont déjà utilisées dans votre commande avec args ? Et si l'utilisateur a besoin d'interpolation dans -c argument?


@Abadiy, re " Mais si elles sont déjà utilisées à l'intérieur de ", tout le point d'utilisation de citations simples est que vous avez moins pour échapper et qu'ils empêchent l'interpolation accidentelle , alors indiquez que vous devez échapper à des guillemets simples ( '' \ '' ') est désagrégné.


@Abadiy, re " Et si l'utilisateur a besoin d'interpolation à l'intérieur de l'argument -c? ", ce serait une très mauvaise chose à faire. Les citations simples empêchent de faire cette erreur! Par exemple, les trois des Bash -C "CAT - $ Fichier" , BASH -C "CAT - \" $ FILE \ "" ET BASH -c "chat - '$ dossier'" sont buggy. Vous devriez utiliser bash -c 'cat - "$ 0"' '"$ fichier" d' fichier " ou fichier =" $ fichier "bash -c 'chat -" $ fichier "'



0
votes

Créer un sous-programme Perl: xxx

et l'utiliser comme ci-dessous: xxx

ou utilisez Perl ici-doc pour multilingue Commandes: xxx


0 commentaires

1
votes

Pour faire face à la course à pied et à des citations imbriquées, cet article fournit la meilleure solution: Comment puis-je utiliser Bash Syntaxe dans le système de Perl ()?

my @args = ( "bash", "-c", "diff <(ls -l) <(ls -al)" );
system(@args);


0 commentaires