Alimenta il comando sorgente con una pipe


25

In precedenza ho usato il sourcecomando in questo modo:

source file_name

Ma quello che sto cercando di fare è questo:

echo something | source

Che non funziona.

Risposte:


38

Poiché source(o .) accetta un file come argomento, puoi provare:

source <(echo something)

1
Ha funzionato, grazie. E felice anno nuovo!
Desmond Hume,

@muru Funziona benissimo. Nota che "| source / dev / stdin" ha l'aspetto di lavorare, ma sarà in realtà cadere tutte le assegnazioni di variabili. Non so perché. Sembra solido in teoria. È follia.
Dustin Oprea,

2
Le pipe @DustinOprea creano una subshell, quindi tutte quelle assegnazioni variabili non influenzano mai la shell genitore.
muru,

8

Il comando source richiede un argomento file. Puoi ottenerlo in alcune shell con una sostituzione di processo, e questo perché allo stesso modo la shell sostituisce ...

arg=$(echo hi)

... il echobit presente sulla riga di comando con l'output della subshell, in caso di sostituzione del processo sostituisce la subshell con un file denominato - di solito /dev/fd/62o qualcosa del genere - un collegamento a un descrittore di file. Con una pipe il descrittore di file è 0, quindi ...

echo 'echo hi' | . /dev/fd/0

... /dev/stdino comunque sia, dovrebbe funzionare perfettamente su qualsiasi sistema linux - e molti altri. Puoi anche usare qui-documenti in modo simile:

. /dev/fd/3 3<<HI
$(echo 'echo hi')
HI

È possibile verificare il modo in cui la shell gestisce la sostituzione del processo, tra l'altro:

(set -x; readlink <(:))

... che stampa (in bash) :

+ set +x
+ readlink /dev/fd/63
++ :
pipe:[2212581]

... e così possiamo vedere che la shell sta facendo la sostituzione e readlinksta leggendo da una pipe anoyema che si apre sul descrittore di file 63.

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.