Próbowałem następującego polecenia po obejrzeniu tego filmu na shenanigans.
man -k . | dmenu -l 20 | awk '{print $1}' | xargs -r man -Tpdf | zathura -
Zasadniczo drukuje listę stron podręcznych do dmenu, aby użytkownik mógł wybrać jedną z nich, a następnie używa xargs do uruchomienia man -Tpdf %
(drukuj, aby ustawić pdf git strony podręcznika z wejścia xargs) i przekazać pdf do czytnika pdf (zathura ).
Problem polega na tym, że (jak widać na filmie) czytnik pdf uruchamia się jeszcze zanim wybiorę jedną stronę podręczną w dmenu. A jeśli kliknę Esc i nie wybiorę żadnego, czytnik pdf jest nadal otwarty i nie pokazuje żadnego dokumentu.
Jak sprawić, by czytnik pdf (i dowolne inne polecenie w łańcuchu potoków) działał tylko wtedy, gdy jego dane wejściowe osiągną koniec pliku lub gdy w ogóle otrzyma dane wejściowe? Lub, alternatywnie, w jaki sposób mogę zatrzymać łańcuch potoków, gdy jedno z połączonych poleceń zwróci niezerowy status wyjścia (tak, że jeśli dmenu zwróci błąd braku wyboru opcji, poniższe polecenia nie zostaną uruchomione)?
źródło
pipefail
opcję basha wymienioną w odpowiedzi Kusalandandy.Odpowiedzi:
Jest
ifne
(w Debianie jest wmoreutils
pakiecie):W Twoim przypadku:
źródło
moreutils
) powinno być w oryginalnym Uniksie i określone przez posix ... To takie podstawowe i uniksowe narzędzie ...ifne
jest nieco zwodnicza. Unix nie ma operacji „podglądania potoku”, więcifne
musi faktycznie odczytać co najmniej jeden bajt przed podjęciem decyzji o uruchomieniu polecenia zależnego. Oznacza to, że nie może po prostu wykonać testu i wykonać polecenia, ale musi utworzyć inną potok, rozwidlić inny proces, aby uruchomić zależne polecenie, i skopiować cały strumień z rury standardowej do rury dolnej. Jeśli przypadek „wprowadzania pustego” nie jest powszechny,ifne
może z łatwością kosztować więcej zasobów niż średnio oszczędza.Pliki PDF powinny być widoczne; każda przeglądarka pdf będzie musiała najpierw spojrzeć na zwiastun, a następnie przejść do przesunięć z tabeli odnośników.
Ponieważ potoki nie są widoczne,
zathura
używa sztuczki zaciemniającej, polegającej na kopiowaniu wszystkich danych wejściowych do pliku tymczasowego, a następnie jak zwykle używaniu tego pliku tymczasowego. Tego rodzaju „sprytna” sztuczka budzi fałszywe nadzieje i prowadzi ludzi do założenia, że pliki pdf można przesyłać strumieniowo.Ale tak czy inaczej,
zathura
naprawdę nie czekać na EOF przed wyświetleniem dokumentu, nie musisz robić nic za to do hapen:Problem polega na tym, że
zathura
nie ma opcji, aby otworzyć okno tylko wtedy, gdy plik jest OK, i wyjść z błędem, jeśli tak nie jest - pozostanie tam tak, jakby wszystko było OK:Więc nawet jeśli przekierowujesz dane wyjściowe do pliku tymczasowego i działasz tylko
zathura
wtedy, gdy wszystko jest w porządku, nie ma gwarancji, że użytkownikowi nie zostanie wyświetlone czarne okno, jeśli z jakiegośzathura
powodu nie spodoba się wynikowi .Btw,
wyświetli stronę podręczną w oknie X11 z
gxditview
, nawet jeśli wygląda prosto z '70 ;-)I oczywiście zawsze możesz użyć:
co, oprócz wielu innych ulepszeń, pozwoli ci używać wyrażeń regularnych podczas wyszukiwania i właściwego wyboru tekstu.
źródło
Wszystkie polecenia w potoku zaczynają się prawie w tym samym czasie. Synchronizuje je tylko wejście / wyjście nad potokiem. Ponadto potok może przechowywać tylko tyle informacji, na ile pozwala bufor bufora.
Dlatego nie można uniknąć uruchomienia jednego etapu potoku, ponieważ
Zamiast tego zapisz dane wyjściowe do pliku, pozwalając na zakończenie potoku. Następnie użyj tego pliku.
Przykład (jako funkcja przyjmująca jeden argument):
To dodatkowo nie uruchomiłoby
zathura
programu, gdyby potok nie powiódł się (xargs
część zwróciła wartość niezerową) lub wygenerowany plik jest pusty.W
bash
powłoce można również ustawićpipefail
opcję powłoki,set -o pipefail
aby potok zwracał status wyjścia pierwszego polecenia w potoku, który się nie powiedzie. I chciałbyś zrobićtmpfile
zmiennąlocal
:To ustawia
pipefail
opcję na czas trwania funkcji, jeśli nie została jeszcze ustawiona, a następnie resetuje ją w razie potrzeby. Pozbywa się-s
testu z pliku wyjściowego.źródło
rm -f
? Czy myślisz o przypadkach, w których potok zmienia uprawnienia do pliku tmp?rm -f
nie wystąpił błąd, jeśli plik został już usunięty (prawdopodobnie przezzathura
, nie wiem).pipefail
opcją działa zgodnie z oczekiwaniami (a także w Zsh, który ma tę samą opcję).