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

По умолчанию grep использует базовые регулярные выражения (BRE). Взгляните на любой ресурс в BRE (например, man grep и man regex ), чтобы изучить синтаксис. $ в «$ var» вообще не передается в grep , потому что он является специальным для оболочки. Если у вас есть переменная оболочки с именем var , ее расширение - это то, что на самом деле видит grep . Если вы этого не сделаете, то grep просто передаст пустую строку, которая соответствует везде.

РЕДАКТИРОВАТЬ: Из спецификации POSIX для BRE специальные символы: * , ^ , $ , . , [, \

Если вы просто хотите сопоставить литеральные строки, не беспокоясь о том, какие символы имеют особое значение в BRE, вам, вероятно, следует использовать fgrep / grep -F вместо этого (это одно и то же; оба соответствуют фиксированным строкам).

1
24.08.2018, 17:30
2 ответа

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

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

Еще одно отличие состоит в том, что если в файл можно не записать, то первая команда с перенаправлением даже не запустит echo, тогда какechoзапустит во второй команде, но teeне удастся записать в файл,(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не доступен для записи текущему пользователю. Это связано с тем, что перенаправление обрабатывается до выполнения команды (см. выше ).

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

echo hello | sudo tee -a file

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

Другой возможностью было бы использование

sudo sh -c 'echo hello >>file'

или

echo hello | sudo sh -c 'cat >>file'

Это будет использовать перенаправление для добавления данных в файл, но в этом случаеоболочка, выполняющая перенаправление, работает от имени пользователя root, поэтому при добавлении/создании файла не произойдет сбой из-за ограничительных разрешений/владения (. file— имя каталога ).

15
27.01.2020, 23:14

Основная причина, по которой мы используем Tee, заключается в перенаправлении вывода в несколько файлов вместо отдельного вызова команды копирования.

например:

wc-l | tee -a file1.txt file2.txt file3.txt

Вы можете повысить привилегии только для команды tee, а не для всего процесса, где as >> инициируется еще до того, как вступят в силу повышенные привилегии.

5
27.01.2020, 23:14

Теги

Похожие вопросы