Tôi muốn chuyển stdin sang tập lệnh bash sang tập lệnh python được gọi trong tập lệnh bash đó


9

Tôi có một tập lệnh bash gọi một tập lệnh python Tôi muốn cung cấp nội dung filethông qua stdin. Gọi tập lệnh bash như:

./script.sh < file

Và nội dung của script.sh:

#! /usr/bin/env bash
pushd /some/python/virtual/environment/working/dir
source venv/bin/activate
python main.py ??????
deactivate
popd

Tôi không biết phải điền gì để ??????chuyển nội dung fileđược cung cấp cho tập lệnh bash dưới dạng stdin sang tập lệnh python main.py.

Lưu ý rằng filecó thể là một tệp văn bản đáng kể và sử dụng bash readkhông mong muốn.

Sử dụng stdin khi gọi tập lệnh bash là một yêu cầu. Tôi linh hoạt để vượt qua bất cứ điều gì để main.py.

Bất kỳ ý tưởng ngoài kia làm thế nào để giải quyết câu hỏi hóc búa này?

thêm vào

Câu trả lời của @cas đã nói rõ với tôi rằng tôi cũng cần giải thích về bối cảnh nào tôi cố gắng sử dụng script.sh.

Tôi muốn sử dụng script.shlàm tập lệnh chuyển tiếp trong ~/.forward, với nội dung:

|/path/to/script.sh

Mà postfix nào gọi là /path/to/script.sh; Nhật ký rõ ràng về điều đó. Một thử nghiệm đơn giản sử dụng phiên bản mặc quần áo của kịch bản python, như:

|/path/to/simple/main.py

Chứng minh rằng postfix thực hiện cuộc gọi main.pyvới nội dung của thư trên stdin. Nhưng sự kết hợp dường như không hoạt động.


bạn đang sử dụng localLDA của chính postfix hay cái gì khác, như procmailhay deliver? Có điều gì trong bạn ~/.bashrccó thể làm xáo trộn môi trường như nhìn thấy main.pykhi chạy từ bên trong script.shkhông? có thể đăng nhập môi trường bằng cách chạy một cái gì đó như { typeset -p ; echo } >> "/tmp/forward.log"bên trong script.sh.
cas

Câu trả lời:


15

Giả sử rằng main.pytập lệnh của bạn được viết chính xác để đọc từ stdin không có gì trong các lần venv/bin/activateđọc từ stdin (*), ??????nên "không có gì cả".

Không có lệnh nào trước đó trong tập lệnh bash sẽ tiêu thụ stdin trước python, vì vậy python sẽ bắt đầu tiêu thụ nó.

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

Hoặc thực hiện main.pyvà chạy nó trực tiếp khi ./main.py... hoạt động như nhau, một trong hai cách.

(*) Nếu có, bạn có lẽ sẽ không thể làm được điều này ở tất cả, mà không cần một cái gì đó xấu xí như chụp tất cả các thiết bị nhập chuẩn cho một biến và sau đó đường ống hoặc <<<chuyển hướng các biến vào đầu tiên venv/bin/activatevà sau đó main.py.


Để có một ví dụ rất rõ ràng về những gì đang xảy ra ở đây và tại sao điều này hoạt động, hãy xem xét tập lệnh sh sau kitten.sh:

#!/bin/sh
cat

Nó chỉ chạy cat, bắt đầu đọc từ stdin và in đầu vào của nó thành thiết bị xuất chuẩn.


5
awww ... mèo rất dễ thương, nó có dòng shebang riêng.
cas

HI @cas Cảm ơn câu trả lời mở rộng. Và, vâng, nó hoạt động như nó cần. Tôi đã mở rộng câu hỏi của mình để làm rõ trong bối cảnh nào tôi đang cố gắng sử dụng nó và nơi nó không hoạt động. Có thể sau đó SE này là diễn đàn sai để đặt câu hỏi.
nanitous

Việc chỉnh sửa đã khiến tôi mất hơn 6 phút ;-)
nanit

Nếu các lệnh khác trước đó trong tập lệnh cần phải sử dụng stdin (các chỉnh sửa trong tương lai của tập lệnh, vân vân), một số hệ điều hành có tên giả có thể được chuyển qua dưới dạng giữ chỗ. Chẳng hạn, dưới nhiều hương vị của Linux, /dev/stdinlà một tệp thiết bị (hoặc một liên kết tượng trưng như vậy) sẽ thực hiện đúng khi đọc từ đó. Dĩ nhiên, sự đánh đổi là tính di động được giới hạn trong các hệ điều hành có tên đặc biệt mà bạn biết, ví dụ: gán một biến cục bộ cho tên tệp giả phù hợp và sau đó sử dụng biến làm đối số python main.py.
Ti Strga

toàn bộ mục đích của tập lệnh của OP là thiết lập môi trường cho python và sau đó chuyển stdin sang main.py, do đó, bất cứ điều gì đã làm sẽ phá vỡ nó.
cas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.