2012-08-22 29 views
7

Tôi cố gắng để ống đầu ra của một lệnh đuôi vào một kịch bản bash để quá trình:ống đầu ra đuôi vào một kịch bản

tail -n +1 -f your_log_file | myscript.sh 

Tuy nhiên, khi tôi chạy nó, các tham số $ 1 (bên trong myscript.sh) không bao giờ đạt được. Tôi đang thiếu gì? Làm thế nào để ống đầu ra là tham số đầu vào của kịch bản?

PS - Tôi muốn đuôi chạy vĩnh viễn và tiếp tục đường ống từng dòng riêng lẻ vào tập lệnh.

Sửa Còn bây giờ toàn bộ nội dung của myscripts.sh là:

echo $1; 
+0

Bạn đang thiếu một cuộc tranh cãi để gán cho '$ 1'.Đường ống nối đầu ra của đuôi với đầu vào chuẩn của tập lệnh của bạn. Bạn có thể đăng 'myscript.sh', hoặc ít nhất là đủ để xác định xem bạn cần một đối số (và đối số đó là gì), và cách nó xử lý dữ liệu được trình bày trên đầu vào tiêu chuẩn của nó. – chepner

Trả lời

13

Nói chung, đây là một cách để xử lý đầu vào tiêu chuẩn để một kịch bản:

#!/bin/bash 

while read line; do 
    echo $line 
done 

Đó là một bash rất thô tương đương với cat. Nó cho thấy một thực tế quan trọng: mỗi lệnh bên trong kịch bản thừa hưởng đầu vào tiêu chuẩn của nó từ trình bao, vì vậy bạn không thực sự cần phải làm bất cứ điều gì đặc biệt để truy cập dữ liệu đến. read lấy đầu vào của nó từ trình bao, trong trường hợp của bạn) là nhận được đầu vào của nó từ quá trình tail kết nối với nó thông qua đường ống.

Ví dụ khác, hãy xem xét tập lệnh này; chúng tôi sẽ gọi nó là 'mygrep.sh'.

#!/bin/bash 

grep "$1" 

Bây giờ đường ống

some-text-producing-command | ./mygrep.sh bob 

cư xử hệt

some-text-producing-command | grep bob 

$1 được thiết lập nếu bạn gọi kịch bản của bạn như thế này:

./myscript.sh foo 

Sau đó, $1 có giá trị "foo".

Thông số vị trí và đầu vào tiêu chuẩn là riêng biệt; bạn có thể làm

tail -n +1 -f your_log_file | myscript.sh foo 

đầu vào Bây giờ tiêu chuẩn này vẫn đến từ các quá trình tail, và $1 vẫn thiết lập để 'foo'.

+0

Không chắc chắn tôi theo dõi. Foo đến từ đâu/có dân cư? – slthomason

+0

'foo' chỉ là một chuỗi tùy ý trên dòng lệnh. Nếu có một chuỗi theo lệnh của bạn, đó là những gì được gán cho '$ 1'. Nếu có chuỗi thứ hai, chuỗi đó được gán cho '$ 2', v.v. Trong ví dụ ban đầu của bạn, bạn không có đối số nào theo sau 'myscript.sh', đó là lý do tại sao' $ 1' không có giá trị. – chepner

+0

đúng - vậy làm cách nào để tôi đưa đầu ra của đuôi vào myscript.sh? thế nào để tôi kết hợp nó vào myscript.sh? Nếu vậy, làm thế nào? – slthomason

1

Có lẽ bạn đã nhầm lẫn với awk?

tail -n +1 -f your_log_file | awk '{ 
    print $1 
}' 

sẽ in cột đầu tiên từ đầu ra của lệnh đuôi.

Trong vỏ, một hiệu ứng tương tự có thể đạt được với:

tail -n +1 -f your_log_file | while read first junk; do 
    echo "$first" 
done 

Ngoài ra, bạn có thể đặt toàn bộ while ... done vòng lặp bên myscript.sh

Các vấn đề liên quan