Saya punya skrip bash dengan skrip python. Saya ingin memberi makan konten file
via stdin. Memanggil skrip bash seperti:
./script.sh < file
Dan isi dari script.sh
:
#! /usr/bin/env bash
pushd /some/python/virtual/environment/working/dir
source venv/bin/activate
python main.py ??????
deactivate
popd
Saya tidak tahu apa yang harus diisi untuk ??????
meneruskan konten yang file
diberikan ke skrip bash sebagai stdin ke skrip python main.py
.
Perhatikan bahwa file
dapat menjadi file teks besar dan menggunakan bash read
adalah tidak diinginkan.
Menggunakan stdin saat menjalankan skrip bash adalah persyaratan. Saya fleksibel untuk melewati apa pun main.py
.
Ada ide di luar sana bagaimana mengatasi teka-teki ini?
tambahan
Jawaban oleh @cas menjelaskan kepada saya bahwa saya juga perlu menjelaskan konteks yang saya coba gunakan script.sh
.
Saya ingin menggunakan script.sh
sebagai skrip penerusan~/.forward
, dengan isinya:
|/path/to/script.sh
Postfix mana yang memanggil /path/to/script.sh
; log jelas tentang itu. Sebuah tes sederhana menggunakan versi skrip python berpakaian, seperti:
|/path/to/simple/main.py
Menunjukkan bahwa postfix memang memanggil main.py
dengan isi surat di stdin. Tetapi kombinasi itu tampaknya tidak berhasil.
sumber
local
LDA postfix sendiri atau sesuatu yang lain, sepertiprocmail
ataudeliver
? Adakah sesuatu di dalam diri Anda~/.bashrc
yang dapat mengganggu lingkungan seperti yang terlihatmain.py
ketika dijalankan dari dalamscript.sh
? mungkin mencatat lingkungan dengan menjalankan sesuatu seperti{ typeset -p ; echo } >> "/tmp/forward.log"
di dalam script.sh.Jawaban:
Dengan asumsi bahwa
main.py
skrip Anda ditulis dengan benar untuk dibaca dari stdin dan bahwa tidak ada yangvenv/bin/activate
dibaca dari stdin (*),??????
harus "tidak sama sekali".Tidak ada perintah sebelumnya dalam skrip bash yang akan mengkonsumsi stdin sebelum python, jadi python akan mulai mengkonsumsinya.
Atau jadikan
main.py
executable dan jalankan secara langsung sebagai./main.py
... berfungsi sama, baik cara.(*) jika ada, Anda mungkin tidak akan bisa melakukan ini sama sekali, tanpa sesuatu yang jelek seperti menangkap semua stdin ke sebuah variabel dan kemudian mem-pipkan atau
<<<
mengarahkan ulang variabel ke awalvenv/bin/activate
dan kemudianmain.py
.Untuk contoh yang sangat jelas tentang apa yang terjadi di sini dan mengapa ini bekerja, pertimbangkan skrip sh berikut
kitten.sh
:Itu hanya berjalan
cat
, yang mulai membaca dari stdin dan mencetak inputnya ke stdout.sumber
/dev/stdin
adalah file perangkat (atau symlink ke sana) yang akan Melakukan Hal yang Benar ketika membaca dari. Pengorbanannya, tentu saja, adalah portabilitas terbatas pada sistem operasi yang namanya khusus Anda ketahui, misalnya, menugaskan variabel lokal ke nama file palsu yang sesuai dan kemudian menggunakan variabel tersebut sebagai argumenpython main.py
.