Question

supposons que vous avez un script perl "de foobar.pl" qui imprime ce qui suit à stdout

date -R

et que vous voulez exécuter quoi que les sorties de script Perl comme une commande bash autonome (ne vous inquiétez pas au sujet des problèmes de sécurité que celui-ci est en cours d'exécution dans un environnement de confiance).

Comment obtenez-vous bash à reconnaître cela comme une commande autonome?

Je l'ai essayé d'utiliser xargs, mais qui semble vouloir passer arguments que à une commande prédéfinie.

Je veux que le script Perl pour pouvoir sortie une commande arbitraire.

$command = 'date -R'
system($command); ## in the perl script 

ne fonctionne pas au-dessus parce que je veux qu'il fonctionne dans un environnement Cygwin existant ...

foobar.pl | xargs bash -i {}

ne fonctionne pas au-dessus parce que bash semble être en cours d'exécution d'un nouveau processus et donc l'initialisation et les paramètres de bash_profile ne soit pas instancié.

Était-ce utile?

La solution

Bad:

`perl foo.pl`
$(perl foo.pl)

Pourquoi est-ce mauvais? En raison de tant de raisons; notamment:

  • Wordsplitting: Qu'est-ce que vous faites ici est de prendre la sortie du script perl, diviser en morceaux là où il y a des espaces, des onglets ou des sauts de ligne, et en prenant ces morceaux comme arguments à la première morceau qui est la commande à exécuter. Dans les cas vraiment très simpliste comme $(echo 'date +%s') il pourrait fonctionner; mais c'est juste une représentation vraiment mauvais de ce que vous faites vraiment ici.
  • Vous ne pouvez pas faire citer ou utiliser d'autres fonctions du shell de bash comme des paramètres, mots-clés bash, etc.

Bon, mais peu pratique:

perl foo.pl > mytmpfile; bash mytmpfile

Création d'un fichier temporaire pour mettre la sortie de votre script perl dans et en cours d'exécution alors que bash fonctionne, mais il est peu pratique que vous devez créer (et nettoyer!) Votre fichier temporaire et ont dans un portably inscriptible (et sécurisé! ) emplacement.

Souvenez-vous également de ne pas utiliser . ou source pour exécuter le fichier temporaire, sauf si vous vraiment l'intention d'exécuter tout dans la coquille active. De plus, lorsque vous utilisez . ou source, vous ne serez pas en mesure de nettoyer de manière fiable votre fichier temporaire après.

Probablement la meilleure solution:

perl foo.pl | bash

Ceci est assez sûr tous azimuts ( « sûr » dans le contexte de, moins sujettes aux bugs) en supposant que votre sortie de script perl syntaxe bash correcte, bien sûr.

Alternatives qui font à peu près la même chose:

bash < <(perl foo.pl)
bash <(perl foo.pl)

Autres conseils

`foobar.pl`

Compte tenu du fichier perl:

print "date";

la commande bash suivante fera.

> $(perl qq.pl)
Mon Apr  6 11:02:07 WAST 2009

Mais qui est exécuté dans une coque séparée. Si vous voulez vraiment l'invoquer dans le cadre de la courant shell, faites ceci:

$ perl qq.pl >/tmp/qq.$$ ; . /tmp/qq.$$ ; rm -f /tmp/qq.$$
Mon Apr  6 11:04:59 WAST 2009

Essayez:

foobar.pl | bash

Je ne pense pas que ce soit exactement ce que vous cherchez, mais ce que j'ai: -)

perl foo.pl > /tmp/$$.script; bash /tmp/$$.script; rm /tmp/$$.script

Bonne chance!

Essayez avec open ($ fh, "- |", arg1 $, arg2 $)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top