Одной из самых распространенных задач при написании сценариев Bash или работе в командной строке Linux является чтение и запись файлов.
В этой статье объясняется, как записать текст в файл в Bash, используя операторы перенаправления и команду tee.
Запись в файл с помощью операторов перенаправления вывода
В Bash перенаправление вывода позволяет перехватить вывод команды и записать его в файл.
Общий формат для перенаправления и записи вывода в файл следующий:
- вывод > имя файла
- вывод >> имя файла
Оператор перенаправления > записывает вывод в заданный файл. Если файл существует, он усекается до нулевой длины. В противном случае файл создается. Будьте очень осторожны при использовании этого оператора, так как вы можете перезаписать важный файл.
Оператор перенаправления >> добавляет вывод в заданный файл. Файл создается, если он не существует.
Вам необходимо иметь права на запись в файл. В противном случае вы получите ошибку с отказом в разрешении.
Вот простой пример, показывающий, как перенаправить вывод команды echo в файл:
1 | echo "this is a line" > file.txt |
Чтобы предотвратить перезапись существующих файлов, включите опцию "noclobber" с помощью встроенного параметра set:
1 2 | set -o noclobber echo "this is a line" > file.txt |
Оператор >| позволяет отменить опцию Bash "noclobber":
1 2 | set -o noclobber echo "this is a line" >| file.txt |
Оператор >> добавляет вывод в конец файла, а не перезаписывает его:
1 | echo "this is a line" >> file.txt |
Используйте команду printf для создания сложного вывода:
1 | printf "Hello, I'm %s.\n" $USER > file.txt |
Если вы хотите записать в файл несколько строк, используйте перенаправление Here document (Heredoc).
Например, вы можете передать содержимое в команду cat и записать его в файл:
1 2 3 4 | cat << EOF > file.txt Текущий рабочий каталог: $PWD Вы вошли в систему под именем $(whoami) EOF |
Чтобы добавить строки, замените > на >> перед именем файла:
1 2 3 4 | cat << << EOF >> file.txt Текущий рабочий каталог: $PWD Вы вошли в систему как $(whoami) EOF |
Вы можете записать вывод любой команды в файл:
1 | date +"Year: %Y, Month: %m, Day: %d" > file.txt |
Вывод команды date будет записан в файл.
Запись в файл с помощью команды tee
Команда tee читает со стандартного ввода и записывает на стандартный вывод и в один или несколько файлов одновременно.
1 | echo "this is a line" | tee file.txt |
По умолчанию команда tee перезаписывает указанный файл, как и оператор >. Чтобы добавить вывод в файл, вызовите команду с опцией -a (--append):
1 | echo "this is a line" | tee -a file.txt |
Если вы не хотите, чтобы tee писал в стандартный вывод, вы можете перенаправить его в /dev/null:
1 | echo "this is a line" | tee file.txt >/dev/null |
Чтобы записать текст в более чем один файл, укажите файлы в качестве аргументов команды tee:
1 | echo "this is a line" | tee file_1.txt file_2.txt file_3.txt |
Еще одним преимуществом команды tee является то, что вы можете использовать ее в сочетании с sudo и записывать в файлы, принадлежащие другим пользователям. Чтобы добавить текст в файл, на который у вас нет прав на запись, добавьте sudo перед tee:
1 | echo "this is a line" | sudo tee file.txt |
Вывод команды echo передается в качестве входных данных команде tee, которая повышает разрешения sudo и записывает текст в файл.