web-dev-qa-db-fra.com

rediriger la sortie de la commande vers une sortie variable et standard dans ksh

J'ai une commande Shell. Je voudrais écrire la sortie sur la sortie standard et l'enregistrer également dans une variable. Je voudrais le résoudre avec une seule commande. J'ai essayé ces choses.

ls > $VAR          # redirects the output to file which name is stored in $VAR
ls | tee -a $VAR   # writes to standard output as well as in file which name is stored in $VAR
VAR=`ls`           # output into $VAR, but it is not sent to standard output
VAR=`ls`;echo $VAR # ok, it works but these are two commands

Une idée?

23
Attila Zobolyak

Que diriez-vous:

VAR=$(ls | tee /dev/tty)
57
Gary Barker

excellente réponse de @Gary_Barker, mais ce n'est pas possible sur tous les systèmes.

Sur notre teamcity il n'y a pas de console de char. Et il y a un autre petit problème.

Si j'utilise

VAR=$(ls -1); echo $VAR

ce n'est pas la même chose que ls -1

Ma solution fonctionne, si cela n'a pas d'importance, que la sortie provient d'un canal d'erreur.

VAR=$(ls -1 | tee >&2)

3
S.W.Joerns

Tel que je le comprend, VAR=`ls`;echo $VAR est OK mais vous n'aimez pas car il contient 2 commandes.

Pendant que @ Gary-Barker travaille, je n'ai pas vérifié tous les systèmes. Si vous avez un problème avec un tee ou un autre, vous pouvez TOUJOURS construire votre propre.

Je ne sais pas si vous le savez, mais la plupart des programmes que vous pouvez utiliser sous Linux ne sont qu'un tas de code utilisant les petits binaires du système. Bien que cela soit vrai, il n'y a aucun sens à utiliser 1 ou 2 commans, car l'exécution finale est vraiment un tas de petits.

Donc, si votre vrai problème est que vous ne pouvez écrire qu'une seule commande dans votre cible, vous pouvez écrire votre propre "application", en créant un script sh dans le dossier/sbin et en le laissant sans extension .sh (car elles sont exécutées avec ./ ou sh préfixe et non par nom)

J'ai écrit cela comme exemple:

#!/bin/bash if [ $1 ] then VAR=$*; echo $VAR fi

Pour cet exemple, j'ai créé le fichier/sbin/varrun. Je l'ai essayé avec les commandes suivantes avec une sortie réussie (normale):

  • varrun ls
  • varrun uname
  • varrun uname -a

Notez que je n'ai pas utilisé de "guillemets" sur les commandes avec des espaces.

0
erm3nda