Jak nazywa się ten operator? Chciałbym znaleźć instrukcję na ten temat.
Vlad T.
96
operator> przekierowuje dane wyjściowe do pliku zastępującego plik, jeśli taki istnieje. >> dołączy do istniejącego pliku.
Triton Man
4
Dziękuję, tutaj jest link do strony wiki, na wypadek, gdyby ktoś tego potrzebował pl.wikipedia.org/wiki/...
Vlad T.
11
Jeśli musisz to zrobić z uprawnieniami roota, zrób to w następujący sposób:sudo sh -c 'echo "some data for the file" >> fileName'
lukaserat
1
Co jeśli mój tekst jest podobny do tego i z jakiegoś powodu nie mogę użyć curllub wget?
asedsami
145
#!/bin/sh
FILE="/path/to/file"/bin/cat <<EOM >$FILE
text1
text2 # This comment will be inside of the file.The keyword EOM can be any text, but it must start the line and be alone.
EOM # This will be also inside of the file, see the space in front of EOM.
EOM # No comments and spaces around here, or it will not work.
text4
EOM
Wyjaśnienie twojego kodu może znacznie przyczynić się do uczynienia go bardziej użytecznym dla innych. Nawet objaśnienia słownictwa, takie jak „dokument tutaj” i „przekierowanie”, mogą kierować osoby poszukujące do innych zasobów.
Palpatim
2
Wyjaśnienie nie jest tak konieczne dla czegoś takiego.
Bhargav Nanekalva
6
Wyjaśnienie nigdy nie jest konieczne, jeśli znasz już odpowiedź. Dla mnie powyższy kod nie jest pomocny z powodu braku szczegółów.
Wiem, że to cholernie stare pytanie, ale ponieważ OP dotyczy skryptów, a fakt, że Google mnie tu sprowadził, powinien również wspomnieć o otwarciu deskryptorów plików do odczytu i zapisu w tym samym czasie.
#!/bin/bash# Open file descriptor (fd) 3 for read/write on a text file.
exec 3<> poem.txt
# Let's print some text to fd 3
echo "Roses are red">&3
echo "Violets are blue">&3
echo "Poems are cute">&3
echo "And so are you">&3# Close fd 3
exec 3>&-
Następnie catplik na terminalu
$ cat poem.txt
Roses are red
Violets are blue
Poems are cute
And so are you
Ten przykład powoduje, że plik poem.txt jest otwarty do odczytu i zapisu na deskryptorze pliku 3. Pokazuje także, że * nix box wie więcej fd niż wtedy stdin, stdout i stderr (fd 0,1,2). W rzeczywistości ma dużo. Zwykle maksymalna liczba deskryptorów plików, które jądro może przydzielić, można znaleźć w /proc/sys/file-maxlub, /proc/sys/fs/file-maxale użycie dowolnego fd powyżej 9 jest niebezpieczne, ponieważ może powodować konflikt z fd używanymi wewnętrznie przez powłokę. Więc nie przejmuj się i używaj tylko 0-9 fd. Jeśli potrzebujesz więcej 9 deskryptorów plików w skrypcie bash, powinieneś użyć innego języka :)
W każdym razie z fd można korzystać na wiele interesujących sposobów.
Możesz uniknąć uruchamiania powłoki roota tylko w celu wydrukowania łańcucha. Spróbuj echo "some data for the file" | sudo tee -a fileName >/dev/nulluruchomić tylko teejako root.
tripleee
6
W środowiskach, w których dokumenty są niedostępne ( Makefile, Dockerfileitp.), Często można zastosować printfrozsądnie czytelne i wydajne rozwiązanie.
printf '%s\n''#!/bin/sh''# Second line' \
'# Third line' \
'# Conveniently mix single and double quotes, too' \
"# Generated $(date)" \
'# ^ the date command executes when the file is generated' \
'for file in *; do' \
' echo "Found $file"' \
'done'>outputfile
Twój komentarz powyżej Wypróbuj echo „danych dla pliku” | sudo tee -a nazwa_pliku> / dev / null, aby uruchomić tee tylko jako root. było naprawdę przydatne!
Kojo
5
Myślałem, że istnieje kilka doskonale dobrych odpowiedzi, ale nie ma zwięzłego podsumowania wszystkich możliwości; a zatem:
Podstawową zasadą większości odpowiedzi tutaj jest przekierowanie . Dwa są ważnymi operatorami przekierowania dla zapisu do plików:
Przekierowanie danych wyjściowych:
echo 'text to completely overwrite contents of myfile' > myfile
Dołączanie przekierowanego wyjścia
echo 'text to add to end of myfile' >> myfile
Tutaj Dokumenty
Inni wspomnieli, a nie ze stałego źródła wejściowego, takiego jak echo 'text', możesz również interaktywnie pisać do plików za pomocą „Dokumentu tutaj”, który jest również szczegółowo opisany w linku do podręcznika bash powyżej. Te odpowiedzi, np
cat > FILE.txt <<EOF lub cat >> FILE.txt <<EOF
skorzystaj z tych samych operatorów przekierowania, ale dodaj kolejną warstwę za pomocą „Dokumentów tutaj”. W powyższej składni piszesz do pliku FILE.txt za pomocą danych wyjściowychcat . Zapis odbywa się dopiero po tym, jak wejście interaktywne otrzyma określony ciąg, w tym przypadku „EOF”, ale może to być dowolny ciąg, np .:
cat > FILE.txt <<'StopEverything' lub cat >> FILE.txt <<'StopEverything'
działałoby równie dobrze. Tutaj Dokumenty również szukają różnych ograniczników i innych interesujących znaków podczas analizowania, więc zajrzyj do dokumentacji, aby uzyskać dodatkowe informacje na ten temat.
Tutaj Struny
Trochę skomplikowane i bardziej ćwiczenie w zrozumieniu zarówno przekierowania, jak i składni Here Documents, ale można połączyć składnię w stylu Here Document ze standardowymi operatorami przekierowań, aby uzyskać ciąg Here:
Przekierowanie wyjścia Cat
cat > myfile <<<'text to completely overwrite contents of myfile'
Dołączanie przekierowanego wyjścia cat input
cat >> myfile <<<'text to completely overwrite contents of myfile'
sudo sh -c 'echo "some data for the file" >> fileName'
curl
lubwget
?źródło
Możesz przekierować wyjście polecenia do pliku:
lub dołącz do niego
Jeśli chcesz pisać bezpośrednio, polecenie to
echo 'text'
źródło
sudo sh -c 'cat file > /etc/init/gunicorn.conf'
(dzięki powyższemu komentarzowi lukaserat)źródło
cat > FILE.txt
a następnie naciśnij ctrl + D, gdy skończysz .Wiem, że to cholernie stare pytanie, ale ponieważ OP dotyczy skryptów, a fakt, że Google mnie tu sprowadził, powinien również wspomnieć o otwarciu deskryptorów plików do odczytu i zapisu w tym samym czasie.
Następnie
cat
plik na terminaluTen przykład powoduje, że plik poem.txt jest otwarty do odczytu i zapisu na deskryptorze pliku 3. Pokazuje także, że * nix box wie więcej fd niż wtedy stdin, stdout i stderr (fd 0,1,2). W rzeczywistości ma dużo. Zwykle maksymalna liczba deskryptorów plików, które jądro może przydzielić, można znaleźć w
/proc/sys/file-max
lub,/proc/sys/fs/file-max
ale użycie dowolnego fd powyżej 9 jest niebezpieczne, ponieważ może powodować konflikt z fd używanymi wewnętrznie przez powłokę. Więc nie przejmuj się i używaj tylko 0-9 fd. Jeśli potrzebujesz więcej 9 deskryptorów plików w skrypcie bash, powinieneś użyć innego języka :)W każdym razie z fd można korzystać na wiele interesujących sposobów.
źródło
Podoba mi się ta odpowiedź:
ale sugeruje,
cat >> FILE.txt << EOF
jeśli chcesz po prostu dodać coś na końcu pliku bez usuwania tego, co już istniejeLubię to:
źródło
Przeniesienie mojego komentarza jako odpowiedzi, zgodnie z żądaniem @lycono
Jeśli musisz to zrobić z uprawnieniami roota, zrób to w następujący sposób:
źródło
echo "some data for the file" | sudo tee -a fileName >/dev/null
uruchomić tylkotee
jako root.W środowiskach, w których dokumenty są niedostępne (
Makefile
,Dockerfile
itp.), Często można zastosowaćprintf
rozsądnie czytelne i wydajne rozwiązanie.źródło
Myślałem, że istnieje kilka doskonale dobrych odpowiedzi, ale nie ma zwięzłego podsumowania wszystkich możliwości; a zatem:
Podstawową zasadą większości odpowiedzi tutaj jest przekierowanie . Dwa są ważnymi operatorami przekierowania dla zapisu do plików:
Przekierowanie danych wyjściowych:
echo 'text to completely overwrite contents of myfile' > myfile
Dołączanie przekierowanego wyjścia
echo 'text to add to end of myfile' >> myfile
Tutaj Dokumenty
Inni wspomnieli, a nie ze stałego źródła wejściowego, takiego jak
echo 'text'
, możesz również interaktywnie pisać do plików za pomocą „Dokumentu tutaj”, który jest również szczegółowo opisany w linku do podręcznika bash powyżej. Te odpowiedzi, npcat > FILE.txt <<EOF
lubcat >> FILE.txt <<EOF
skorzystaj z tych samych operatorów przekierowania, ale dodaj kolejną warstwę za pomocą „Dokumentów tutaj”. W powyższej składni piszesz do pliku FILE.txt za pomocą danych wyjściowych
cat
. Zapis odbywa się dopiero po tym, jak wejście interaktywne otrzyma określony ciąg, w tym przypadku „EOF”, ale może to być dowolny ciąg, np .:cat > FILE.txt <<'StopEverything'
lubcat >> FILE.txt <<'StopEverything'
działałoby równie dobrze. Tutaj Dokumenty również szukają różnych ograniczników i innych interesujących znaków podczas analizowania, więc zajrzyj do dokumentacji, aby uzyskać dodatkowe informacje na ten temat.
Tutaj Struny
Trochę skomplikowane i bardziej ćwiczenie w zrozumieniu zarówno przekierowania, jak i składni Here Documents, ale można połączyć składnię w stylu Here Document ze standardowymi operatorami przekierowań, aby uzyskać ciąg Here:
Przekierowanie wyjścia Cat
Dołączanie przekierowanego wyjścia cat inputcat > myfile <<<'text to completely overwrite contents of myfile'
cat >> myfile <<<'text to completely overwrite contents of myfile'
źródło
Można również użyć tutaj dokumentu i vi, poniższy skrypt generuje plik FILE.txt z 3 liniami i interpolacją zmiennych
Plik będzie miał 3 linie, jak poniżej. „i” uruchamia tryb wstawiania vi i podobnie zamyka plik za pomocą Esc i ZZ.
źródło
to moja odpowiedź. $ cat file> plik_kopii
źródło