По умолчанию grep
использует базовые регулярные выражения (BRE). Взгляните на любой ресурс в BRE (например, man grep
и man regex
), чтобы изучить синтаксис. $
в «$ var»
вообще не передается в grep
, потому что он является специальным для оболочки. Если у вас есть переменная оболочки с именем var
, ее расширение - это то, что на самом деле видит grep
. Если вы этого не сделаете, то grep
просто передаст пустую строку, которая соответствует везде.
РЕДАКТИРОВАТЬ: Из спецификации POSIX для BRE специальные символы: *
, ^
, $
, .
, [
, \
Если вы просто хотите сопоставить литеральные строки, не беспокоясь о том, какие символы имеют особое значение в BRE, вам, вероятно, следует использовать fgrep
/ grep -F
вместо этого (это одно и то же; оба соответствуют фиксированным строкам).
Нет никакой разницы в том смысле, что данные в файле будут одинаковыми, если 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
— имя каталога ).
Основная причина, по которой мы используем Tee, заключается в перенаправлении вывода в несколько файлов вместо отдельного вызова команды копирования.
например:
wc-l | tee -a file1.txt file2.txt file3.txt
Вы можете повысить привилегии только для команды tee, а не для всего процесса, где as >> инициируется еще до того, как вступят в силу повышенные привилегии.