Intereting Posts
Как я могу сгладить два шаблона из одного файла и направить строки на разные выходные файлы в зависимости от того, какая совпадение соответствует? как выполнять команды (удаленные, асинхронные, pull) Как считывать неиспользуемые последовательные контакты (RTS, CTS и т. Д.)? EFI grub исчез, как вернуть его? iwlwifi VS NetworkManager Linux ext4 раздел продолжает конвертировать все файлы в режиме только для чтения Спам-сообщения появляются в очереди exim, но нет пользователей электронной почты для этого домена Как запустить Arch Linux pacaur не интерактивно? Где я могу найти список кодов ошибок «make»? Драйверы Dell Inspiron 5110 для Linux Mint Qiana 32bit / 64bit Почему мы должны использовать корневой раздел размером ~ 15-25 ГБ? Установка загрузчика на Mac Как отобразить устройство «Имя» при запуске hcitool lescan и btmon? Как подключить клиентов Как передать аргумент, хранящийся в переменной, в WGET

Есть ли разница между tee и >> при использовании echo?

Есть ли разница между выполнением:

echo "hahaha" >> file1 

а также

 echo "hahaha" |tee -a file1 

?

Да, я заметил, что я не могу писать для записи защищенных файлов, даже с sudo echo , но я могу, если я sudo tee . Благодарю.

Нет разницы в том смысле, что данные в файле будут одинаковыми, если echo и tee успешно выполнены и файл доступен для записи текущему пользователю.

Команда tee дополнительно выдаст вывод на свой стандартный вывод, показывая текст, который также будет добавлен в файл. Это не произойдет в первой команде.

Другое отличие состоит в том, что если файл не может быть записан, то первая команда с redirectм даже не запустит echo , тогда как echo будет выполнено во второй команде, но при записи в файл произойдет сбой ( tee все равно будет выводить текст на терминале, хотя)

Это может быть важно в случае, если вы запускаете какой-то длительный процесс, который выдает результат:

 long_running_thing >>file 

Это даже не запустит long_running_thing если file не будет доступен для записи.

 long_running_thing | tee -a file 

Это выполнит long_running_thing и будет выполняться до конца, но никакие выходные данные не будут сохранены в file если они не будут доступны для записи (и выходные данные будут дополнительно записаны в терминал из tee ).

Следующее, о чем вы должны знать, на что вы намекали в конце вопроса, это то, что

 sudo echo hello >>file 

не будет работать, если file не доступен для записи текущему пользователю. Это связано с тем, что redirect обрабатывается до выполнения команды (см. Выше).

Чтобы добавить файл, принадлежащий корню, используйте

 echo hello | sudo tee -a file 

Здесь мы запускаем tee как root. echo не обязательно должно выполняться пользователем root, но утилита, которая фактически записывает в файл, должна выполняться как root (или как пользователь, владеющий файлом), если она не принадлежит текущему пользователю.

Другая возможность будет использовать

 sudo sh -c 'echo hello >>file' 

При этом будет использоваться redirect для добавления данных в файл, но в этом случае shell, которая выполняет redirect, работает от имени пользователя root, поэтому при добавлении / создании файла не будет возникать ошибка из-за ограниченных прав доступа / владения (она все равно может завершиться ошибкой если, например, file – это имя каталога).