Przechwytywanie danych wyjściowych polecenia w zmiennej

1

Wiesz kiedy robisz coś takiego apt-cache search something | less? Cóż (w skrypcie Bash), jak uzyskać dane wejściowe i ustawić je na zmienną (tak jak lessrobi, ale lessnie jest to skrypt Bash)?

Ian
źródło
Chcesz więc zdefiniować zmienną zawierającą dane wyjściowe polecenia w skrypcie Bash?
cyr

Odpowiedzi:

1

Jeśli chcesz zrobić coś takiego, jak to, co lesssię dzieje (otrzymaj dane wejściowe na jego standardowym wejściu, przetworz je, a następnie wyślij) w skrypcie, który piszesz, możesz użyć while readpętli w skrypcie.

#!/bin/bash
echo "Beginning"
while read -r line
do
    echo "Processed: [$line]"
done
echo "Ending"

Następnie możesz uruchomić go w następujący sposób:

some_command | your_script

a Twój wynik będzie wyglądał następująco:

Beginning
Processed: [First line of input]
Processed: [Second line of input]
Processed: [Third line of input]
Processed: [Fourth line of input]
Ending

Zakładając, że some_commandsamo to daje:

First line of input
Second line of input
Third line of input
Fourth line of input

Zmiennej $lineprzypisuje się kolejno wartość każdego wiersza danych wejściowych. Możesz kumulować te linie, jeśli potrzebujesz, łącząc każdą linię ze zmienną skalarną:

all=$all$line

lub

all+=$line

lub dodając elementy na końcu tablicy:

array+=($line)
Dennis Williamson
źródło
3

Jesteś nieporozumienie command | less. W tym scenariuszu lesspolecenie nie powoduje połączenia; potok łączy poprzednie polecenie z less. Mówisz także „dane wejściowe”, a myślę, że masz na myśli „dane wyjściowe”. W tym przypadku wpisujesz do terminala; wyjście jest tym, co commandwypluwa z powrotem. less otrzymuje dane wyjściowe polecenia za pośrednictwem |(potok). Potok przyjmuje standardowe wyjście jednego polecenia i podłącza je jako standardowe wejście drugiego. ( Ten artykuł z Wikipedii może być pomocny na początek).

Aby przypisać wyjście jednej komendy do zmiennej, normalnie zrobiłbyś coś takiego:

variable=$(command)
# older syntax for above
variable=`command`

Ale bardzo wątpię, czy naprawdę chcesz przypisać dane wyjściowe apt-cache search foozmiennej.

Czy możesz rozwinąć nieco swój większy cel? Co naprawdę próbujesz zrobić?

Telemachus
źródło