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'.
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