2015-10-20 22 views
87

Nie mogę sprawić, by jq zachowywał się "normalnie" w powłoce potoku. Na przykład:Jak używać `jq` w powłoce potoku?

$ curl -s https://api.github.com/users/octocat/repos | jq | cat 

skutkuje jq prostu drukując jego pomocą tekstu *. To samo dzieje się, gdy próbuję przekierować wyjście jq „s do pliku:

$ curl -s https://api.github.com/users/octocat/repos | jq > /tmp/stuff.json 

Czy jq celowo ratowanie jeżeli stwierdzi, że nie jest prowadzony z terminala? Jak mogę zapobiec takiemu zachowaniu, aby móc używać jq w potoku?


* (zdaję sobie sprawę, przykład ten zawiera useless use of cat, jest to jedynie ilustracja)

Odpowiedz

158

Trzeba podać filtr jako argument. Przekazać JSON przez niemodyfikowana inny niż ładnego drukowania jq dostarcza domyślnie użyć filtru tożsamości .:

curl -s https://api.github.com/users/octocat/repos | jq '.' | cat 
+0

Dlaczego rura do "kot"? Czy to naprawdę konieczne? –

+15

Zostawiłem to, ponieważ OP miał to; Zakładam, że to tylko symbol zastępczy, który wskazuje, że 'jq' zarówno czyta z fajki, jak i pisze do innej rury. Jeśli pożądaniem jest po prostu zobaczenie wyjścia 'jq', to' cat' sam w sobie jest niepotrzebny. – chepner

+3

(1) jq wersja 1.5 została ulepszona tak, że. w takich przypadkach jest niepotrzebne. (2) Nie ma potrzeby cytowania ".". – peak

3

Jeden przypadek użycia znalazłem się robi często, jak dobrze jest „Jak skonstruować danych JSON dostarczać do innych poleceń powłoki, na przykład curl? " Sposób, w jaki to zrobić za pomocą opcji --null-input/-n:

Nie czytaj żadnych danych w ogóle! Zamiast tego filtr jest uruchamiany jednokrotnie przy użyciu wejścia null. Jest to przydatne, gdy używasz jq jako prostego kalkulatora lub do tworzenia danych JSON od zera.

a przykładem przekazaniem go do curl:

jq -n '{key: "value"}' | curl -d @- \ 
    --url 'https://some.url.com' \ 
    -H 'Content-Type: application/json' \ 
    -H 'Accept: application/json' 
+4

To fajne, ale nie wiesz, jak to ma znaczenie dla tego pytania? – mgalgs

+1

@mgalgs Stwierdziłem, że chcę generować/używać 'jq' na początku potoku powłoki, a nie na środku/końcu, aby filtrować dane.Przykład "curl" jest podstawowym, ale często używałem ręcznego wpisywania danych JSON do 'curl' i próbowałem poprawnie cytować, więc pomyślałem, że może to być przydatne również dla innych. – mkobit