Odpowiedzi:
echo "some data for the file" >> fileName
sudo sh -c 'echo "some data for the file" >> fileName'
#!/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
Możesz przekierować wyjście polecenia do pliku:
$ cat file > copy_file
lub dołącz do niego
$ cat file >> copy_file
Jeśli chcesz pisać bezpośrednio, polecenie to echo 'text'
$ echo 'Hello World' > file
sudo sh -c 'cat file > /etc/init/gunicorn.conf'
(dzięki powyższemu komentarzowi lukaserat)
#!/bin/bash
cat > FILE.txt <<EOF
info code info
info code info
info code info
EOF
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.
#!/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 cat
plik 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-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.
Podoba mi się ta odpowiedź:
cat > FILE.txt <<EOF
info code info
...
EOF
ale sugeruje, cat >> FILE.txt << EOF
jeśli chcesz po prostu dodać coś na końcu pliku bez usuwania tego, co już istnieje
Lubię to:
cat >> FILE.txt <<EOF
info code info
...
EOF
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:
sudo sh -c 'echo "some data for the file" >> fileName'
echo "some data for the file" | sudo tee -a fileName >/dev/null
uruchomić tylko tee
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.
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
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:
echo 'text to completely overwrite contents of myfile' > myfile
echo 'text to add to end of myfile' >> myfile
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.
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 Catcat > myfile <<<'text to completely overwrite contents of myfile'
cat >> myfile <<<'text to completely overwrite contents of myfile'
Można również użyć tutaj dokumentu i vi, poniższy skrypt generuje plik FILE.txt z 3 liniami i interpolacją zmiennych
VAR=Test
vi FILE.txt <<EOFXX
i
#This is my var in text file
var = $VAR
#Thats end of text file
^[
ZZ
EOFXX
Plik będzie miał 3 linie, jak poniżej. „i” uruchamia tryb wstawiania vi i podobnie zamyka plik za pomocą Esc i ZZ.
#This is my var in text file
var = Test
#Thats end of text file