Powiedzmy, że mam skrypt, który chcę potokować do innej komendy lub przekierować do pliku (do potoków sh
dla przykładów). Załóżmy, że używam bash.
Mógłbym to zrobić za pomocą echo
:
echo "touch somefile
echo foo > somefile" | sh
Mógłbym również zrobić prawie to samo, używając cat
:
cat << EOF
touch somefile
echo foo > somefile
EOF
Ale jeśli zamienię „EOF” na „EOF | sh”, to po prostu pomyśli, że to część heredoc.
Jak mogę to zrobić, aby cat
wypisywać tekst ze standardowego wejścia, a następnie przesyłać go do dowolnej lokalizacji?
shell
io-redirection
cat
here-document
strugee
źródło
źródło
touch
jest chyba, że tam jest, czego dokładnie chcesz? jest po prostu czytać plik wejściowy i przekierowywać do innego przy pomocy stdout?echo
- zastanawiałem się, jaki byłby odpowiednik tegocat
.sh
skryptu z wielu ciągów i przekazywanie go bezpośrednio dosh
. Znalazłem twoje Q szukające przekazania wyniku tekstowego wielu poleceń, w tym TUTAJ dokumentu, bezpośrednio do polecenia. Tak właśnie robi drugi przykład odpowiedzi Asha.Odpowiedzi:
Można to zrobić na wiele sposobów. Najprostszy jest prawdopodobnie taki:
Kolejna, moim zdaniem, ładniejsza składnia:
Działa to również, ale bez podpowłoki:
Więcej wariantów:
Lub:
Nawiasem mówiąc, oczekuję, że użycie
cat
w twoim pytaniu jest symbolem zastępczym dla czegoś innego. Jeśli nie, wyjmij go w następujący sposób:Co można uprościć do tego:
lub:
Przekierowanie wyjścia zamiast potoku
Używanie w
cat
celu uzyskania odpowiednikaecho test > out
:Wiele dokumentów tutaj
Daje to wynik:
Oto co się dzieje:
( ... )
i uruchamia załączone polecenia w podpowłoce.cat <&3
Mówi uruchomić kot z deskryptora pliku (fd) 0 (stdin) przekierowany z fd 3; innymi słowy, wyjmij dane wejściowe z fd 3.(...)
uruchomieniem powłoka widzi dwa przekierowania dokumentu tutaj i zastępuje fd 0 (<<EOF
) i fd 3 (3<<EOF2
) stroną odczytu potokówźródło
(cat; echo ---; exec <&3; cat) <<EOF 3<<EOF2 >out
a następnie podać dane polecenia za pomocą dwóch bloków tutaj w rzędzie.cat
równoważne zecho test > out
użyciem heredoc. Natomiast podany przykład dodał przekierowanie na końcu potoku.Chcę tylko zauważyć, że używanie
meow
jest tak samo ważne jakEOF
.Ten skrypt zostanie dołączony
Meow!
do pliku o nazwiecat
:Zapisz jako
cats
i zrób to za pomocąchmod +x cats
, a następnie uruchom za pomocą./cats
:Wyjaśnienie:
cat <<meow
to składnia dokumentu tutaj . Nakazuje skryptowi pobranie bloku tekstu następującego po tej linii, dopóki nie napotka łańcuchameow
. Zawartość zostanie następnie wyprowadzona (lub przesłana dalej).>> cat
potoki do pliku o nazwiecat
.>
zamiast zamiast>>
spowoduje zastąpienie pliku zamiast dołączenia do niego.Meow!
jest zawartością niniejszego dokumentu .meow
jest znacznikiem końcowym dla dokumentu tutaj . Zawartość jest, za pomocą>>
, dołączana docat
.Pipowanie zarówno do standardowego wejścia, jak i do pliku:
Aby wykonać instalację rurową, o którą prosisz, nie jest wymagany żaden dokument tutaj .
cat
nie może zarówno wyświetlać tekstu, jak i przekazywać go dalej, aletee
idealnie pasuje do tego, o co prosisz:Spowoduje to wyświetlenie ciągu
echo
i zapisanieecho
do pliku o nazwietee
.Możesz również przekazać dane wyjściowe
cat
, jeśli jest to częścią wymagania, albo:Lub tylko:
Zawartość pliku:
źródło
>
nie tworzy rur jako ostatnia kula implikuje.>
może tworzyć potoki,zsh
gdy ten sam fd jest przekierowywany kilka razy, jak wecho foo >&1 > tee
lubecho foo > tee | cat
, gdziezsh
implementuje wewnętrzny,tee
aby podawać dane wyjścioweecho
zarównocat
dotee
pliku, jak i do pliku.