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 -f
opcja 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ść?
command-line
bash
vlad-ardelean
źródło
źródło
foo | bar
ibar < foo
są one równoważne. Oni nie są.Odpowiedzi:
Używasz tutaj dwóch różnych rzeczy i powinieneś użyć trzeciej. Zobaczmy:
|
: To jest operator potoku , służy do przekazywania wyniku jednego procesu jako danych wejściowych do drugiego:Spowoduje to uruchomienie programu
foo
i przekazanie jego danych wyjściowych jako danych wejściowych do programubar
.>
,<
,>>
I<<
: Są to operatory przekierowania , służą do przesyłania danych do / z plików :foo > bar
: uruchamia programfoo
i zapisuje dane wyjściowe w plikubar
, zastępując 1 jego zawartość i tworząc go, jeśli nie istnieje.foo >> bar
: uruchamia programfoo
i zapisuje dane wyjściowe w plikubar
, dołączając do jego zawartości i tworząc ją, jeśli nie istnieje.foo < bar
: działafoo
, mówiąc mu, aby odczytał dane wejściowe z plikubar
.<<
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 :Konstrukt
<< SomeStringHere > Out.file
przekieruje cały napisany tekst, dopóki nie napotka końcowego łańcucha (EOF
w powyższym przykładzie) do pliku docelowego. Dokumenty umożliwiają łatwe formatowanie ciągów wieloliniowych i zawierają zmienne i znaki specjalne.<<<
Operator The Tutaj String , jest niczym Tutaj Dokumentu ale rozszerza zmienne. Na przykład:Powyższe polecenie jest równoważne z
echo "$bar" | grep foo
.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)
.Na
at
przykład możesz to zrobić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
<
doat now
.1 Domyślnym zachowaniem jest zastępowanie, można to zmienić, ustawiając
noclobber
opcję bash. Jeśli ustawione,echo foo > bar
zakończy się niepowodzeniem, jeślibar
istnieje. W takim przypadku można goecho foo |> bar
zamiast tego wymusić . Patrz sekcja 3.6.2 tutaj .źródło
<<
i<<<
(które @steeldriver wspomniał w swojej odpowiedzi). Co więcej, czy jest coś więcej - coś w stylu>>>>>>
lub<<<<<<<<<<
?<<<
:)W tym przypadku
echo "notify-send HELLO"
jest to proces nie jest plik - więc trzeba podstawienie procesowe zamiast przekierowania plikówMożna również użyć ciągu tutaj, aby
echo
całkowicie uniknąć poleceniaźródło