Ответы:
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
Вы можете перенаправить вывод команды в файл:
$ cat file > copy_file
или добавить к нему
$ cat file >> copy_file
Если вы хотите написать непосредственно команду echo 'text'
$ echo 'Hello World' > file
sudo sh -c 'cat file > /etc/init/gunicorn.conf'
(спасибо комментарию lukaserat выше)
#!/bin/bash
cat > FILE.txt <<EOF
info code info
info code info
info code info
EOF
cat > FILE.txt
затем нажмите Ctrl + D, когда вы закончите .
Я знаю, что это чертовски старый вопрос, но поскольку ОП касается сценариев и того факта, что Google привел меня сюда, следует также упомянуть открытие файловых дескрипторов для чтения и записи одновременно.
#!/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>&-
Тогда cat
файл на терминале
$ cat poem.txt
Roses are red
Violets are blue
Poems are cute
And so are you
В этом примере файл poem.txt открывается для чтения и записи в файловом дескрипторе 3. Он также показывает, что * nix-окна знают больше fd, чем просто stdin, stdout и stderr (fd 0,1,2). Это на самом деле много держит. Обычно максимальное количество файловых дескрипторов, которое может выделить ядро, может быть найдено /proc/sys/file-max
или, /proc/sys/fs/file-max
но использование любого fd выше 9 опасно, поскольку может конфликтовать с fd, используемым оболочкой внутри. Так что не беспокойтесь и используйте только fd's 0-9. Если вам нужно больше 9 файловых дескрипторов в bash-скрипте, вы все равно должны использовать другой язык :)
В любом случае, fd можно использовать во многих интересных случаях.
Мне нравится этот ответ:
cat > FILE.txt <<EOF
info code info
...
EOF
но предложил бы, cat >> FILE.txt << EOF
если вы хотите просто добавить что-то в конец файла, не стирая то, что уже существует
Как это:
cat >> FILE.txt <<EOF
info code info
...
EOF
Перемещение моего комментария в качестве ответа в соответствии с просьбой @lycono
Если вам нужно сделать это с правами root, сделайте это так:
sudo sh -c 'echo "some data for the file" >> fileName'
echo "some data for the file" | sudo tee -a fileName >/dev/null
запустить только tee
как root.
В средах, где документы здесь недоступны ( Makefile
и Dockerfile
т. Д.), Вы часто можете использовать их printf
для разумного и эффективного решения.
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
Я думал, что было несколько совершенно прекрасных ответов, но нет краткого описания всех возможностей; таким образом:
Основным принципом, лежащим в основе большинства ответов здесь, является перенаправление . Два важных оператора перенаправления для записи в файлы:
echo 'text to completely overwrite contents of myfile' > myfile
echo 'text to add to end of myfile' >> myfile
Другие упомянутые, а не из фиксированного источника ввода, как echo 'text'
, вы также могли бы в интерактивном режиме записывать в файлы через «Здесь документ», которые также подробно описаны в ссылке на руководство bash выше. Эти ответы, например,
cat > FILE.txt <<EOF
или cat >> FILE.txt <<EOF
использовать те же операторы перенаправления, но добавить еще один слой через «Здесь документы». В приведенном выше синтаксисе вы пишете в FILE.txt через выводcat
. Запись происходит только после того, как для интерактивного ввода задана какая-то конкретная строка, в данном случае «EOF», но это может быть любая строка, например:
cat > FILE.txt <<'StopEverything'
или cat >> FILE.txt <<'StopEverything'
будет работать так же хорошо. Здесь Документы также ищут различные разделители и другие интересные символы синтаксического анализа, поэтому взгляните на документы для получения дополнительной информации об этом.
Немного запутанный, и больше упражнений в понимании как перенаправления, так и синтаксиса Here Documents, но вы можете объединить синтаксис стиля Here Document со стандартными операторами перенаправления, чтобы стать Here String:
Перенаправление вывода ввода catcat > myfile <<<'text to completely overwrite contents of myfile'
cat >> myfile <<<'text to completely overwrite contents of myfile'
Также можно использовать здесь document и vi, приведенный ниже скрипт генерирует FILE.txt с 3 строками и переменной интерполяцией
VAR=Test
vi FILE.txt <<EOFXX
i
#This is my var in text file
var = $VAR
#Thats end of text file
^[
ZZ
EOFXX
Тогда файл будет иметь 3 строки, как показано ниже. «i» - запустить режим вставки vi и аналогичным образом закрыть файл с помощью Esc и ZZ.
#This is my var in text file
var = Test
#Thats end of text file