2012-08-22 19 views
7

próbuję rury wyjście polecenia ogona do innego skryptu bash do procesu:rura wyjściowa ogon do innego skryptu

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

Jednak, gdy go uruchomić, parametr $ 1 (wewnątrz myscript.sh) nigdy nie zostanie osiągnięty. czego mi brakuje? Jak potokować wyjście jako parametr wejściowy skryptu?

PS - Chcę, aby ogon działał wiecznie i kontynuował instalację poszczególnych linii w skrypcie.

Edit Na razie całą zawartością myscripts.sh są:

echo $1; 
+0

Brakuje argument przypisać do '$ 1 '.Rura łączy wyjście ogona ze standardowym wejściem twojego skryptu. Czy możesz opublikować "myscript.sh", lub przynajmniej na tyle, aby określić, czy potrzebujesz argumentu (i jaki powinien być ten argument) oraz jak będzie on obsługiwał dane prezentowane na jego standardowym wejściu. – chepner

Odpowiedz

13

Generalnie, tutaj jest jeden sposób, aby obsługiwać standardowe wejście do skryptu:

#!/bin/bash 

while read line; do 
    echo $line 
done 

czyli bardzo szorstki bash odpowiadający cat. To demonstruje kluczowy fakt: każde polecenie wewnątrz skryptu dziedziczy standardowe wejście z powłoki, więc nie musisz robić nic specjalnego, aby uzyskać dostęp do danych. read pobiera dane wejściowe z powłoki, która (w twoim przypadku) pobiera dane z procesu tail podłączonego do niego przez rurę.

Jako inny przykład rozważ ten skrypt; nazwać to "mygrep.sh".

#!/bin/bash 

grep "$1" 

Teraz gazociąg

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

zachowuje się identycznie jak

some-text-producing-command | grep bob 

$1 jest ustawiony jeśli zadzwonisz skrypt tak:

./myscript.sh foo 

Następnie $1 ma wartość "foo".

Parametry pozycyjne i standardowe wejście są oddzielne; można zrobić to teraz norma

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

wejście jest nadal pochodzących z procesu tail i $1 jest nadal ustawiony na „foo”.

+0

Nie jestem pewien, czy podążam. Skąd się bierze/pojawia się dziecko? – slthomason

+0

'foo' jest po prostu dowolnym ciągiem w wierszu poleceń. Jeśli istnieje ciąg zgodny z twoim poleceniem, to jest to przypisane do '$ 1'. Jeśli istnieje drugi ciąg, który zostanie przypisany do '$ 2' i tak dalej. W twoim oryginalnym przykładzie nie masz argumentów po 'myscript.sh', dlatego' $ 1' nie ma żadnej wartości. – chepner

+0

right - więc jak mogę potokować wyjście ogona do myscript.sh? czy włączam go do myscript.sh? Jeśli tak to jak? – slthomason

1

Być może twój był zdezorientowany z awk?

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

wydrukuje pierwszą kolumnę z wyniku polecenia ogon.

w powłoce, podobny efekt można osiągnąć za pomocą:

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

Alternatywnie, można umieścić cały while ... done pętlę wewnątrz myscript.sh