J'ai un script «myscript» qui produit les éléments suivants:
abc
def
ghi
dans un autre script, j'appelle:
declare RESULT=$(./myscript)
et $RESULT
obtient la valeur
abc def ghi
Existe-t-il un moyen de stocker le résultat soit avec les sauts de ligne, soit avec le caractère '\ n' pour que je puisse le sortir avec ' echo -e
'?
Réponses:
En fait, RESULT contient ce que vous voulez - pour démontrer:
Ce que vous montrez, c'est ce que vous obtenez:
Comme indiqué dans les commentaires, la différence est que (1) la version entre guillemets doubles de la variable (
echo "$RESULT"
) préserve l'espacement interne de la valeur exactement telle qu'elle est représentée dans la variable - nouvelles lignes, tabulations, espaces vides et tout - alors que (2 ) la version sans guillemets (echo $RESULT
) remplace chaque séquence d'un ou plusieurs blancs, tabulations et sauts de ligne par un seul espace. Ainsi, (1) préserve la forme de la variable d'entrée, tandis que (2) crée une seule ligne de sortie potentiellement très longue avec des «mots» séparés par des espaces simples (où un «mot» est une séquence de caractères non blancs; il n'est pas nécessaire 't être alphanumériques dans aucun des mots).la source
Un autre écueil avec cela est que la substitution de commandes -
$()
- supprime les nouvelles lignes. Probablement pas toujours important, mais si vous voulez vraiment conserver exactement ce qui a été sorti, vous devrez utiliser une autre ligne et quelques citations:Ceci est particulièrement important si vous souhaitez gérer tous les noms de fichiers possibles (pour éviter un comportement indéfini comme opérer sur le mauvais fichier).
la source
pwd=`pwd`; ls $pwd/$file
, vous avez obtenu un retour à la ligne avant le/
, et mettre le nom entre guillemets n'a pas aidé. Il a été corrigé rapidement. C'était en 1983-5 sur ICL Perq PNX; le shell n'avait pas$PWD
de variable intégrée.Dans le cas où vous êtes intéressé par des lignes spécifiques, utilisez un tableau de résultats:
la source
readarray
et substitution au lieu de substitution de commande de processus:readarray -t RESULT < <(./myscript>
.En plus de la réponse donnée par @ l0b0, je venais d'avoir la situation où je devais à la fois conserver toutes les nouvelles lignes en fin de sortie du script et vérifier le code retour du script. Et le problème avec la réponse de l0b0 est que «l'écho x» réinitialisait $? retour à zéro ... j'ai donc réussi à trouver cette solution très astucieuse:
la source
die ()
fonction qui accepte un code de sortie arbitraire et éventuellement un message, et je voulais utiliser une autreusage ()
fonction pour fournir le message mais les sauts de ligne continuaient à être écrasés, j'espère que cela me permet contourner cela.Après avoir essayé la plupart des solutions ici, la chose la plus simple que j'ai trouvée était évidente - en utilisant un fichier temporaire. Je ne suis pas sûr de ce que vous voulez faire avec la sortie de plusieurs lignes, mais vous pouvez ensuite traiter cela ligne par ligne en utilisant la lecture. La seule chose que vous ne pouvez pas vraiment faire est de tout coller facilement dans la même variable, mais pour la plupart des raisons pratiques, c'est beaucoup plus facile à gérer.
Hack rapide pour lui faire faire l'action demandée:
Notez que cela ajoute une ligne supplémentaire. Si vous travaillez dessus, vous pouvez le coder, je suis juste trop paresseux.
EDIT: Bien que ce cas fonctionne parfaitement, les personnes qui lisent ceci doivent savoir que vous pouvez facilement écraser votre stdin à l'intérieur de la boucle while, vous donnant ainsi un script qui exécutera une ligne, effacera stdin et quittera. Comme ssh fera ça je pense? Je viens de le voir récemment, d'autres exemples de code ici: /unix/24260/reading-lines-from-a-file-with-bash-for-vs- while
Encore une fois! Cette fois avec un descripteur de fichier différent (stdin, stdout, stderr valent 0-2, nous pouvons donc utiliser & 3 ou plus dans bash).
vous pouvez également utiliser mktemp, mais ce n'est qu'un exemple de code rapide. L'utilisation de mktemp ressemble à:
Utilisez ensuite $ filenamevar comme vous le feriez pour le nom réel d'un fichier. Il n'a probablement pas besoin d'être expliqué ici, mais quelqu'un s'est plaint dans les commentaires.
la source
bash
pièges courants .read
extension de commande-u 3
pour lire à partir du descripteur de fichier 3.Que diriez-vous de cela, il lira chaque ligne dans une variable et qui peut être utilisée par la suite! dire que la sortie de myscript est redirigée vers un fichier appelé myscript_output
la source