Ubuntu: esegui l'output di un altro comando


13

Ho una riga di comando che genera un'altra riga di comando, ad esempio:

> commandlineA param1 param2
  commandlineB param1

Vorrei avere un'unica esecuzione da riga di comando che eseguirà commandlineB con i parametri indicati.

Esiste un modo semplice per farlo utilizzando una singola riga di comando o devo eseguire un piccolo file bash che memorizzerà l'output in una variabile e quindi eseguirlo?

Grazie


2
Ho cercato per un po ', ma suppongo che dovessi pubblicare una domanda da trovare da solo .... $ (commandlineA param1 param2) ha fatto il lavoro.
Lior Ohana,

Risposte:


17

Sembra che tu l'abbia risolto da solo, ma puoi usare:

$(command parameter1 parameter2)

Modifica di modifica: il seguente è in qualche modo errato, mentre esegue il comando in una subshell, risulta che le variabili di ambiente saranno ancora disponibili. Ci scusiamo per le persone fuorvianti ...

Modifica: che verrà eseguito in una subshell, non verranno utilizzate le variabili di ambiente non esportate. Se si desidera eseguire un comando nella stessa shell, è necessario utilizzare:

eval $(command parameter1 parameter2)

Un'altra risposta è quella di sondare bash stesso:

echo 'uname -a' | bash 

Ciò verrà eseguito anche in una subshell, per essere eseguito nella stessa shell sarà necessario:

echo 'uname -a' | bash -c

Per inciso, puoi anche usare back tick al posto della sintassi $ (), ma non è raccomandato .


(1) Non so esattamente cosa intendi con "che verrà eseguito in una subshell". Variabili d'ambiente non esportate verranno utilizzati. (2) Non vedo alcun motivo per utilizzare evalqui. Se hai un motivo, per favore spiegalo. (3) Il tuo ultimo esempio (con  -c) è totalmente sbagliato.
Scott,

Hai ragione, ho controllato di nuovo e mi sbagliavo lì. Durante l'esecuzione come elenco, le forchette della shell bash e le variabili di ambiente sono ancora disponibili. Quindi hai ragione, mi dispiace per quello.
Chris Sherlock,

4

Usa questo:

commandlineA param1 param2 | bash

Esempio:

echo "uname -a" | bash

Produzione:

Linux k1104 2.6.38-8-generic # 42-Ubuntu SMP lun 11 apr 03:31:50 UTC 2011 i686 i686 i386 GNU / Linux

Non c'è niente di sbagliato in questo, tuttavia genererà un'altra shell bash.
Chris Sherlock,

Così farà$(commandlineA param1 param2)
triplo il

@tripleee: stai confrontando arance e zucche.  printf '\143\144\040\057\n' | bashè in definitiva un no-op, perché il comando viene eseguito in un nuovo processo di shell separato (e transitorio). Al contrario, $(printf '\143\144\040\057\n')la shell corrente, attiva e interattiva cambierà directory.
Scott,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.