Jak stwierdzić, który parametr jest dostarczany do polecenia z operatorem przekierowania?

9

To działa:

$ echo „powiadom-wyślij CZEŚĆ” | w tej chwili

To nie:

$ at <echo „powiadom-wyślij CZEŚĆ”

Mówi „nie znaleziono pliku lub katalogu”.

Rozumiem, że istnieje -fopcja dla tego polecenia, za pomocą której mogę dostarczyć plik do wykonania w danym momencie.

Więc to mnie zastanowiło ... ogólnie, skąd mam wiedzieć, dla którego parametru operatorzy przekierowujący podają wartość?

vlad-ardelean
źródło
5
Twoje pytanie nie jest bardzo jasne. Co rozumiesz przez „który parametr”. Twoim problemem jest prawdopodobnie to, że (przez pomyłkę) myślisz o tym foo | bari bar < foosą one równoważne. Oni nie są.
terdon

Odpowiedzi:

16

Używasz tutaj dwóch różnych rzeczy i powinieneś użyć trzeciej. Zobaczmy:

  1. |: To jest operator potoku , służy do przekazywania wyniku jednego procesu jako danych wejściowych do drugiego:

    foo | bar

    Spowoduje to uruchomienie programu fooi przekazanie jego danych wyjściowych jako danych wejściowych do programu bar.

  2. >, <, >>I <<: Są to operatory przekierowania , służą do przesyłania danych do / z plików :

    • foo > bar: uruchamia program fooi zapisuje dane wyjściowe w pliku bar , zastępując 1 jego zawartość i tworząc go, jeśli nie istnieje.

    • foo >> bar: uruchamia program fooi zapisuje dane wyjściowe w pliku bar , dołączając do jego zawartości i tworząc ją, jeśli nie istnieje.

    • foo < bar: działa foo, mówiąc mu, aby odczytał dane wejściowe z pliku bar .

    • <<Jest przypadkiem szczególnym, ponieważ nie ma sensu „jako załączniki” wejście do polecenia, <<to głównie (wyłącznie AFAIK) używany do Tutaj Dokumenty :

      $ cat << EOF > file.txt
      > Hello World!
      > EOF
      

      Konstrukt << SomeStringHere > Out.fileprzekieruje cały napisany tekst, dopóki nie napotka końcowego łańcucha ( EOFw powyższym przykładzie) do pliku docelowego. Dokumenty umożliwiają łatwe formatowanie ciągów wieloliniowych i zawierają zmienne i znaki specjalne.

  3. <<<Operator The Tutaj String , jest niczym Tutaj Dokumentu ale rozszerza zmienne. Na przykład:

    grep foo <<< "$bar"

    Powyższe polecenie jest równoważne z echo "$bar" | grep foo.

  4. To, czego tak naprawdę szukasz, nazywa się podstawieniem procesu i jest innym sposobem na przekazanie danych wyjściowych komendy innemu. Składa się z <(command).

    foo <(bar) 

    Na atprzykład możesz to zrobić

    at now < <(echo "notify-send HELLO")

    Powyższe działa, ponieważ podstawienie procesu faktycznie tworzy plik (przeczytaj link powyżej, aby uzyskać więcej informacji) i jest to deskryptor tego pliku, który jest przekazywany <do at now.


1 Domyślnym zachowaniem jest zastępowanie, można to zmienić, ustawiając noclobberopcję bash. Jeśli ustawione, echo foo > barzakończy się niepowodzeniem, jeśli baristnieje. W takim przypadku można go echo foo |> barzamiast tego wymusić . Patrz sekcja 3.6.2 tutaj .

terdon
źródło
1
Niezła odpowiedź! bardzo dokładny (szczególnie uwzględniając różnice między przekierowaniami plików)
steeldriver
@steeldriver aww, pieprzy się, dziękuję :) I to był ten niedoceniany klejnot. Chciałbym móc dać ci +1 za każdą z różnych pułapek, których rozwiązanie cicho unika.
terdon
Czy możesz również rozwinąć, aby uwzględnić informacje na temat <<i <<<(które @steeldriver wspomniał w swojej odpowiedzi). Co więcej, czy jest coś więcej - coś w stylu >>>>>>lub <<<<<<<<<<?
Aditya
@Aditya gotowe. I nie martw się, zatrzymuje się na <<<:)
terdon
12

W tym przypadku echo "notify-send HELLO"jest to proces nie jest plik - więc trzeba podstawienie procesowe zamiast przekierowania plików

at now < <(echo "notify-send HELLO")

Można również użyć ciągu tutaj, aby echocałkowicie uniknąć polecenia

at now <<< "notify-send HELLO"
steeldriver
źródło
5
Widząc pytania, które lubisz (te same, które mam), myślę, że powinieneś poświęcić trochę więcej czasu na systemy Unix i Linux . Żyjemy i umieramy za fajne sztuczki z
muszelką
@terdon: to samo dla golfistów Perla?
Sylvain Pineau
1
@SylvainPineau oooh tak. Bardzo tak :). Poważnie, pytanie, które lubisz, steeldriver i ja, jest tam o wiele bardziej powszechne. To miejsce jest pełne maniaków komend, z których niektórzy mają absurdalną wiedzę.
terdon