Perintah sumber feed dengan pipa

25

Sebelumnya saya menggunakan sourceperintah seperti ini:

source file_name

Tapi yang saya coba lakukan adalah ini:

echo something | source

Yang tidak berhasil.

Desmond Hume
sumber

Jawaban:

38

Karena source(atau .) mengambil file sebagai argumen, Anda dapat mencoba:

source <(echo something)
muru
sumber
1
Itu berhasil, terima kasih. Dan selamat Tahun Baru!
Desmond Hume
@uru Ini bagus sekali. Perhatikan bahwa "| source / dev / stdin" memiliki tampilan yang berfungsi, tetapi sebenarnya akan menghapus semua tugas variabel. Tidak yakin kenapa. Tampak solid dalam teori. Ini kegilaan.
Dustin Oprea
2
@DustinOprea pipa membuat subkulit, sehingga semua tugas variabel tidak pernah mempengaruhi shell induk.
muru
8

Perintah sumber Anda memerlukan argumen file. Anda bisa mendapatkannya di beberapa shell dengan substitusi proses, dan ini karena dengan cara yang sama shell menggantikan ...

arg=$(echo hi)

... echobit di sana pada command-line dengan output subshell, dalam kasus substitusi itu menggantikan subshell dengan file bernama - biasanya /dev/fd/62atau sesuatu - beberapa tautan ke deskriptor file. Dengan pipa deskriptor file adalah 0 jadi ...

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

... /dev/stdinatau apa pun masalahnya harus bekerja dengan baik pada sistem linux - dan banyak lainnya. Anda juga dapat menggunakan di sini-dokumen serupa:

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

Anda dapat memverifikasi cara shell Anda menangani substitusi proses, dengan cara:

(set -x; readlink <(:))

... yang cetakan (dalam bash) :

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

... dan kita dapat melihat bahwa shell sedang melakukan substitusi dan readlinksedang membaca dari sebuah pipa anoymous yang dibuka pada file-descriptor 63.

mikeserv
sumber