2011-10-26 4 views
19

Ho un comando di shell. Vorrei scrivere l'output sullo standard output e salvarlo anche in variabile. Mi piacerebbe risolverlo con un comando. Ho provato queste cose.output di comando di reindirizzamento in uscita variabile e standard in ksh

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 

Qualche idea?

+0

Solo curioso della limitazione a 1 linea. questo mi rende non la radice di, o anche un utente del target di sistema. Non riesco a capire perché hai questa limitazione. Ad ogni modo ti ho inviato una risposta "doyourself". – erm3nda

risposta

46

ne dite:

VAR=$(ls | tee /dev/tty) 
+1

Funziona, grazie mille. –

+0

A seconda del sistema operativo, anche 'var = $ (ls | tee/proc/$$/fd/1)' potrebbe funzionare. –

+0

Anche se funziona perfettamente, ti metto un esempio di "fai-da-te". Im un noob di Linux/bash, ma mi piace apprenderò questi suggerimenti: D – erm3nda

3

grande risposta da @Gary_Barker, ma questo non è possibile in tutti i sistemi.

Sul nostro teamcity non è presente una console di navigazione. E c'è un altro piccolo problema.

Se uso

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

non è la stessa come ls -1

La mia soluzione funziona, se non importa, che l'output viene dal tubo di errore.

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

+0

Assicurati di raddoppiare l'eco se il risultato è più di una riga. 'VAR = $ (ls -1); echo "$ VAR" '. altrimenti viene schiacciato in una sola riga – hoss

+0

@hoss puoi spiegare perché questo accada? –

0

quanto ho capito, VAR=`ls`;echo $VAR è OK, ma non ti piace perché ha 2 comandi su di esso.

Mentre @ Gary-Barker sta funzionando, non ho verificato tutti i sistemi. Se hai problemi con il tee o un altro, puoi costruire il tuo SEMPRE.

Non so se lo sai, ma molti dei programmi che puoi usare su Linux sono solo un mucchio di codice che usa i piccoli binarys sul sistema. Mentre questo è vero, non ha senso usare 1 o 2 commans, perché l'esecuzione finale è davvero un mucchio di piccoli.

Quindi, se il tuo vero problema è che puoi solo scrivere un singolo comando nel tuo target, puoi scrivere la tua "app", facendo uno sh script nella cartella/sbin e lasciandolo senza .sh extension (perché questi sono excecuted con ./ o il prefisso sh e non per nome)

ho scritto che, come ad esempio:

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

Per questo esempio ho rendere il file/sbin/varrun. Ho provato con i comandi folling con successo (normale) Uscita:

  • varrun ls
  • varrun uname
  • varrun uname -a

Si noti che non ho usato "virgolette" sui comandi con spazi.