我想管的尾部命令的輸出到另一個bash腳本來處理:管尾輸出到另一個腳本
tail -n +1 -f your_log_file | myscript.sh
然而,當我運行它,$ 1參數(myscript.sh內)永遠不會達到。我錯過了什麼?如何將輸出管道作爲腳本的輸入參數?
PS - 我想讓尾巴永久運行,並繼續將每個單獨的行傳送到腳本中。
編輯 現在myscripts.sh的全部內容是:
echo $1;
我想管的尾部命令的輸出到另一個bash腳本來處理:管尾輸出到另一個腳本
tail -n +1 -f your_log_file | myscript.sh
然而,當我運行它,$ 1參數(myscript.sh內)永遠不會達到。我錯過了什麼?如何將輸出管道作爲腳本的輸入參數?
PS - 我想讓尾巴永久運行,並繼續將每個單獨的行傳送到腳本中。
編輯 現在myscripts.sh的全部內容是:
echo $1;
一般來說,這裏是處理標準輸入腳本的一種方法:
#!/bin/bash
while read line; do
echo $line
done
這是一個非常粗糙的bash相當於cat
。它確實證明了一個關鍵事實:腳本中的每個命令從shell繼承它的標準輸入,所以你並不需要做任何特殊的事情來訪問數據。read
從shell獲取它的輸入,在你的情況)是從tail
過程中通過管道連接到它的輸入。
作爲另一個例子,考慮這個腳本;我們將其稱爲'mygrep.sh'。
#!/bin/bash
grep "$1"
現在管道
some-text-producing-command | ./mygrep.sh bob
行爲相同
some-text-producing-command | grep bob
$1
如果你打電話給你這樣的腳本設置:
./myscript.sh foo
然後$1
具有值「foo」。
位置參數和標準輸入是分開的;你可以這樣做
tail -n +1 -f your_log_file | myscript.sh foo
現在的標準輸入還是從tail
過程中來,並$1
仍設置爲「富」。
不知道我關注。 foo來自哪裏/來自哪裏? – slthomason
'foo'只是命令行上的一個任意字符串。如果你的命令後面有一個字符串,那就是分配給'$ 1'的東西。如果還有第二個字符串,它被分配到'$ 2',等等。在你最初的例子中,你在'myscript.sh'後沒有參數,這就是爲什麼'$ 1'沒有價值。 – chepner
正確 - 那麼如何將尾部輸出管道輸入到myscript.sh?我只是將它合併到myscript.sh中?如果是這樣,怎麼樣? – slthomason
也許你與awk
混淆?
tail -n +1 -f your_log_file | awk '{
print $1
}'
將打印tail命令輸出中的第一列。
在shell中,類似的效果可以達到:
tail -n +1 -f your_log_file | while read first junk; do
echo "$first"
done
或者,你可以把整個while ... done
循環內myscript.sh
你缺少變量分配到'$ 1'。管道將尾部的輸出連接到腳本的標準輸入。你可以發佈'myscript.sh',或者至少可以確定是否需要參數(以及該參數應該是什麼),以及它如何處理其標準輸入中呈現的數據。 – chepner