Agak rumit untuk memberi nama ini ...
Pada dasarnya saya memiliki program yang ketika menjalankan cetakan pada STDOUT satu set variabel shell:
$ ./settings
SETTING_ONE="this is setting one"
SETTING_TWO="This is the second setting"
ANOTHER_SETTING="This is another setting".
Saya ingin menjalankan ini dari dalam skrip shell seolah-olah STDOUT sedang dievaluasi dengan source
.
Saya ingin melakukan sesuatu seperti ...
source `./settings`
... tapi tentu saja itu tidak berhasil.
Saya tahu saya bisa melakukannya:
./settings >/tmp/file
source /tmp/file
tetapi saya benar-benar tidak ingin melakukan itu.
Ada petunjuk?
sh
juga - itu bisa menjadi symlink ke dash, ash, busybox ... Saya belum melihat salinan live "the 'sh'".$( )
- dimulai dengan shell Almquist di 4.3BSD - dan juga POSIX. (Catatan: tidak berdebat, hanya ingin tahu.)Pada sistem di mana
/dev/fd
tersedia, bash mendukung penggantian proses:Di sini,
<( )
akan diperluas ke jalur yang ditetapkan secara otomatis di bawah/dev/fd/...
dari mana output./settings
dapat dibaca.sumber
Atau tentu saja ...
Mengujinya tentu saja ...
Menangani ruang kosong:
sumber
export
triknya berhasil! Terima kasiha backtick --> ` <--
and here's another one --> ` <--
source /dev/stdin < ./settings
Saya pikir / dev / stdin adalah Linux saja.
sumber
/dev/stdin
bekerja pada BSD dan Cygwin juga.|
, bagaimanapun, tidak akan bekerja (setidaknya tidak persis), karena kedua sisi pipa yang subproses terpisah, sehingga perintah bersumber tidak akan mempengaruhi shell saat ini./dev/stdin
trik ini , tapi apa jawaban Anda sebenarnya setara dengan dataransource ./settings
tanpa menjalankannya. Satu bisa menggunakan di sini-dokumen untuk mengatasi hal ini:source /dev/stdin <<EOF \n $(./settings) \n EOF
.Ingin memberikan perspektif lain di sini, karena jawaban yang lain membuat file dan tidak langsung menarik dari stdin. Saya memiliki beberapa bangunan yang perlu mengirimkan beberapa informasi lingkungan yang disiapkan ke beberapa skrip. Apa yang saya lakukan adalah menyiapkan sekelompok tugas variabel yang kompatibel dengan Bash dalam sebuah string:
Ketika saya bersiap untuk menjalankan skrip, saya base64 menyandikan string multiline di atas dan pipa itu ke skrip shell saya:
Dalam build.sh saya membaca dari stdin, base64 decode dan evaluasi hasilnya.
sumber