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? P>
PS . La commande que j'essaie de courir est la suivante: p>
6 Réponses :
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`;
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?
Je pensais exécutera la coquille
(/ bin / sh) avec le chemin du
fichier comme premier argument. p>
blockQuote>
Vous pouvez toujours faire perl code> honorerait la variable
$ coquille code>, mais cela m'a eu lieu que son comportement pourrait en réalité dépendre du
exécuté de votre système code> la mise en oeuvre. Dans le mien, il semble que
exec code> p>
qw / bash votre-commande / code>, non? p>
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.
Cet exemple fonctionne pour moi:
$ perl -e 'print `/bin/bash -c "echo <(pwd)"`' /dev/fd/63
ESSAYEZ
`bash -c \"your command with args\"`
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'` code>
Vous pouvez également évader de cibler des problèmes en utilisant ouvrir mon $ FH, '- |', qw (bash -c), $ cmdline code> qui est à peu près garanti de fonctionner exactement comme `$ cmdline` - mais L'interface est différente.
Ces \ code> 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 code>? Et si l'utilisateur a besoin d'interpolation dans
-c code> argument?
@Abadiy, re " Mais si elles sont déjà utilisées à l'intérieur de i>", tout le point d'utilisation de citations simples est que vous avez moins i> pour échapper et qu'ils empêchent l'interpolation accidentelle , alors indiquez que vous devez échapper à des guillemets simples ( ' code> ⇒
' \ '' ' code>) est désagrégné.
@Abadiy, re " Et si l'utilisateur a besoin d'interpolation à l'intérieur de l'argument -c? I>", 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" CODE>,
BASH -C "CAT - \" $ FILE \ "" CODE> ET
BASH -c "chat - '$ dossier'" code> sont buggy. Vous devriez utiliser
bash -c 'cat - "$ 0"' '"$ fichier" d' fichier " code> ou
fichier =" $ fichier "bash -c 'chat -" $ fichier "' code >
Créer un sous-programme Perl: et l'utiliser comme ci-dessous: p> ou utilisez Perl ici-doc pour multilingue Commandes: p>
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);
Je suis assez certain que la réponse est "tu n'es pas".
Pourquoi? Quel est votre euphémisme?
sh code> est universel,
bash code> n'est pas.
@ether: essayez
perl -wle'print `echo foo; PS --Forest` ' code> pour voir
sh code>.
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 code>
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.