Saya ingin meneruskan stdin ke skrip bash ke skrip python yang dipanggil skrip bash

9

Saya punya skrip bash dengan skrip python. Saya ingin memberi makan konten filevia 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 filediberikan ke skrip bash sebagai stdin ke skrip python main.py.

Perhatikan bahwa filedapat menjadi file teks besar dan menggunakan bash readadalah 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.shsebagai 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.pydengan isi surat di stdin. Tetapi kombinasi itu tampaknya tidak berhasil.

nanitous
sumber
Apakah Anda menggunakan localLDA postfix sendiri atau sesuatu yang lain, seperti procmailatau deliver? Adakah sesuatu di dalam diri Anda ~/.bashrcyang dapat mengganggu lingkungan seperti yang terlihat main.pyketika dijalankan dari dalam script.sh? mungkin mencatat lingkungan dengan menjalankan sesuatu seperti { typeset -p ; echo } >> "/tmp/forward.log"di dalam script.sh.
cas

Jawaban:

15

Dengan asumsi bahwa main.pyskrip Anda ditulis dengan benar untuk dibaca dari stdin dan bahwa tidak ada yang venv/bin/activatedibaca dari stdin (*), ??????harus "tidak sama sekali".

Tidak ada perintah sebelumnya dalam skrip bash yang akan mengkonsumsi stdin sebelum python, jadi python akan mulai mengkonsumsinya.

#/bin/bash
pushd /some/python/virtual/environment/working/dir
source venv/bin/activate
python main.py
deactivate

Atau jadikan main.pyexecutable 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 awal venv/bin/activatedan kemudian main.py.


Untuk contoh yang sangat jelas tentang apa yang terjadi di sini dan mengapa ini bekerja, pertimbangkan skrip sh berikut kitten.sh:

#!/bin/sh
cat

Itu hanya berjalan cat, yang mulai membaca dari stdin dan mencetak inputnya ke stdout.

cas
sumber
5
awww ... kucing itu sangat lucu, ia memiliki garis shebang sendiri.
cas
HI @cas Terima kasih atas jawaban yang luas. Dan, ya itu berfungsi sebagaimana mestinya. Saya telah memperluas pertanyaan saya untuk memperjelas dalam konteks mana saya mencoba menggunakannya dan di mana itu tidak berhasil. Bisa jadi SE ini adalah forum yang salah untuk bertanya.
nanitous
Hasil edit saya membutuhkan waktu lebih dari 6 mnt ;-)
nanitous
Jika perintah lain sebelumnya dalam skrip perlu mengkonsumsi stdin (pengeditan skrip yang akan datang, dan sebagainya), beberapa sistem operasi memiliki nama file pseudo yang dapat diedarkan sebagai placeholder. Di bawah banyak rasa Linux, misalnya, /dev/stdinadalah 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 argumen python main.py.
Ti Strga
seluruh tujuan skrip OP adalah untuk mengatur lingkungan untuk python dan kemudian meneruskan stdin ke main.py, jadi apa pun yang melakukan itu akan merusaknya.
cas