Je suis en train de faire quelque chose comme çaSource de Standard In (Bash sur OSX)
ruby test.rb | source /dev/stdin
où test.rb qu'afficher sur cd /
. Il n'y a pas d'erreurs, mais ça ne fait rien non plus. Si j'utilise ceci:
ruby test.rb > /tmp/eraseme2352; source /tmp/eraseme2352
cela fonctionne très bien, mais je veux éviter le fichier intermédiaire.
Editer: Le but de tout cela est que les changements doivent persister lorsque la commande est terminée. Désolé, je n'ai pas précisé cela plus tôt.
Votre première commande 'fonctionne'; le problème est que le pipeline s'exécute dans une sous-shell, de sorte que le sous-shell source la sortie de ruby, puis se termine, laissant le processus parent inchangé. C'est pourquoi le fichier temporaire explicite fonctionne comme vous le souhaitez. Recherchez «Substitution de processus» (§ 3.5.6 dans le manuel 4.0 Bash) et voyez si vous pouvez utiliser: 'source <(ruby test.rb)'. –
Empiriquement, ça ne marche pas: ça fonctionne aussi dans une sous-shell, je suppose. –
Ne fonctionne pas - parce que vous obtenez 'sh: erreur de syntaxe près d'un jeton inattendu '(''? C'est ce que j'ai obtenu sur Snow Leopard avec 'sh' comme shell, mais ça marche bien si j'utilise bash au lieu de sh Si j'essaie 'cat <(echo abc)' j'obtiens le résultat attendu (une ligne de sortie avec 'ab c'). Si j'essaie 'source' ou '.' À la place, il semble être ignoré - ce que je prendre pour être équivalent à "il forge et exécute la commande et le sous-shell fait la source et puis sort" .Un essai, mais pas la réponse.Il semble que vous aurez à faire le travail de longue main , vous souvenant d'effacer le fichier eraseme dès que possible –