Làm thế nào để đầu ra đường ống chính xác vào thành phố nói


4

Tôi nhận ra rằng saylệnh có thể tuyệt vời khi kết hợp với một lệnh / chương trình khác bởi vì nó có thể đọc cho bạn đầu ra. Tôi đã cố gắng chuyển đầu ra từ leaveđến saybằng cách gõ đoạn sau trong terminal, nhưng nó không hoạt động.

leave +5 | say

cách chính xác để làm điều này là gì?


Dựa trên phân tích ban đầu, tôi không nghĩ bạn sẽ có thể, bởi vì leavedĩa / daemonizes và rời khỏi vỏ của bạn.
Jason Salaz

Vì vậy, bạn không thể đầu ra ống từ daemon đến một chương trình khác?
styfle

Bạn có thể có thể nắm bắt đầu ra của daemon và chuyển nó sang một chương trình khác, nhưng không chỉ đơn giản như|

Câu trả lời:


8

Dựa trên câu trả lời của mankoff, công việc này:

leave +1 2>&1 | while read line ; do echo $line | say ; done

mặc dù để lại không còn biến mất vào nền và cho phép bạn tiếp tục gõ. Tương tự:

leave +1 2>&1 | while read line ; do echo $line | say ; done &

sẽ làm cho nó biến mất vào nền, nhưng cũng sẽ nói một số ID quá trình (vô hại). Vì vậy, không phải là khá hoàn hảo, nhưng cả hai đều làm việc.

(Tôi đang tìm kiếm một giải pháp để:

ping google.com | say

mà có một vấn đề tương tự, và ai đó đề nghị ở trên là một giải pháp. Tôi đã không thêm điều này dưới dạng nhận xét vào câu trả lời của mankoff vì tôi không thể tìm ra cách đặt dấu cách và dòng mới trong nhận xét.).


Bạn không thể đặt dòng mới trong các bình luận. Không may.
Jason Salaz

1
bạn có thể chỉnh sửa câu trả lời của tôi, nhưng tôi nghĩ ý kiến ​​của bạn xứng đáng với 'câu trả lời' của riêng họ. Để tắt ID tiến trình, có thể một cái gì đó trước khi |saythích |grep -v ^[0-9]*$, v.v.

Cảm ơn đã làm việc. Tôi đoán read linelà đọc từng dòng của một đầu vào và sau đó bạn chỉ cần lặp lại dòng đó để bạn có thể dẫn nó đến say?
styfle

Có, và while ... dobiểu mẫu đảm bảo rằng nó thực hiện lặp lại cặp dòng / dòng nói . (Vấn đề là khi bạn nhập vào đường ống vào say, nó chờ đợi cho đến khi toàn bộ kết thúc đầu vào trước khi nói tất cả của nó cùng một lúc, tuy nhiên readcó một dòng và dừng lại. Vì vậy, các mã chops một đầu ra liên tục vào khối dòng cỡ và khởi chạy saymột lần cho mỗi khúc).
TessellatingHeckler

7

Ví dụ của bạn là, nói chung, cách chính xác để dẫn đầu ra bình thường để nói:

 cat file | say
 echo "hello world" | say

Vấn đề cụ thể là |ký tự (ống) chuyển STDOUTtừ lệnh bên trái sang STDINlệnh bên phải. saysau đó nói bất cứ điều gì là trên STDIN.

Tuy nhiên, leavekhông in trực tiếp đầu ra STDOUT. Nó hoặc là sử dụng STDERR, hoặc một số cơ chế tin nhắn khác. Bạn có thể chuyển STDERRqua |, nhưng cú pháp phụ thuộc vào shell. Đối với bash, bạn sẽ làm như vậy, mặc dù tôi không chắc chắn rằng điều này sẽ làm leaveviệc với say, vì tôi không quan tâm nhiều leave.

cmd 2>&1 |cmd2

STDERRhoặc một số cơ chế tin nhắn khác? Tại sao bạn đã làm được điều đó. Một bình luận khác dường như nghĩ rằng vấn đề là đó leavelà một daemon. Lệnh cuối cùng mà bạn đã viết là gì? cmd 2>&1 |cmd2
styfle

Các lệnh lệnh cuối cùng STDOUT và STDERR qua đường ống. Thông thường chỉ có STDOUT bị bắt và STDERR đi bất cứ nơi nào lệnh đầu tiên sẽ gửi nó. Tại sao sẽ leavelàm điều đó (bất kể "đó" là gì)? Bởi vì các tác giả đã viết nó theo cách đó.

Tôi đã từng là lệnh để ống STDERRtừ leaveđến sayvà nó gần như làm việc. Về cơ bản, tất cả các đầu ra được gửi cùng một lúc chứ không phải theo gia số.
styfle

2

Ngoài ra, nếu bạn muốn chuyển một tập tin đang diễn ra, "công thức" cũng hoạt động với đuôi:

tail -f ~/Documents/activity.log | while read line ; do echo $line | say ; done

0

Tôi nghĩ đơn giản là bạn có thể sử dụng leavecho điều đó, thay vì sử dụng sleepvới số giây chính xác (đặt nó thành một tập lệnh ngắn để chuyển đổi giây thành phút, giờ):

sleep 60 && say -v Vicki 'Time to leave!' &

Đó là một giải pháp thú vị mặc dù Câu hỏi không phải là làm thế nào để máy tính nói Thời gian rời đi; Tôi muốn biết làm thế nào để đầu ra ống từ một chương trình đến say. Cảm ơn đã trả lời mặc dù.
styfle
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.