Чи є якесь значення для використання трійника?


47

Чому майже всі вказівки щодо додавання тексту до системних файлів на кшталт fstabі /etc/apt/sources.list.d/<name>.listвключають використання tee та echo додавання зазначеного тексту?

Візьміть такі приклади, які виконуються як корінь :

## 1
echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee -a file1
## 2
echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' >> file2

Біг diff -u file1 file2нічого не повертає; запущені md5sum file1 file2шоу їх контрольні суми однакові, що повертає мене до мого оригінального питання:

Чому | tee <FILENAME>настільки поширений в усіх документах Ubuntu, це просто хороша практика, інакше не було б простіше просто використовувати приклад 2 замість передачі результату від echoдо tee?


1
У ваших командах вам не вистачає судо; це покаже різні результати між двома;)
Rinzwind

1
@Rinzwind Я виконую ці команди як root.
Олексій Магура

Відповіді:


83

Існує різниця: трійник дублює вихід: він надсилає його як у файл, так і на дисплей.

Але є ще:

  • Наприклад, якщо ви хочете написати якийсь рядок у два файли одночасно, команда з tee, яку ви можете використовувати, це:

     echo "some text" | tee file1 > file2  
    
  • Ще одна річ, яка може допомогти вам, - це уникати однієї проблеми при використанні судо. Нормальний оператор переадресації виводу завжди виконується з вашими привілеями користувача, також коли ви пишете sudo перед командою, яка генерує текст STDOUT. Іншими словами, це не вдасться, якщо у вас немає дозволу на запис у цей файл:

     sudo echo "something" > bar  
    

    Але з трійкою все буде добре:

    echo "something" | sudo tee bar  
    

2 приклади з цього сайту . У ньому є ще трохи.


Можна sudoбез tee- sudo sh -c 'echo SOMETHING > FILE'...;)
Вільф

7
@wilf Так, але коли потрібно виводити котирування ", все стає безладним
Брайам

3
У першому випадку, якщо ви хочете записати в N файли, я вважаю за краще echo "some text" | tee file1 file2 ... fileNі, можливо, додаю > /dev/null, якщо ви не хочете захаращувати stdout.
Ельмар Зандер

Nice one @ElmarZander :)
Rinzwind

13

teeприймає стандартний вхідний потік і записує його як у стандартний вихідний потік, так і у поток файлів. Якщо це допомагає людям запам’ятати, назва команди походить від T-розгалужувача в сантехніці. Є приємна стаття у Вікіпедії, де я дізнався про походження назви команди.

введіть тут опис зображення введіть тут опис зображення


11

Перш за все, teeсам не додає текст, а також не додає >.

Саме ДОДАТОК текст tee -aта його доповнення >>.

Я не вірю, що всі оболонки підтримують цю >>функцію, тому саме teeїї частіше використовують. (Подумайте просто про старе sh). Трійник - це команда, а >>оператор.

Якщо ви використовуєте (мій особистий улюблений) bash, >і вам >>набагато приємніше / простіше.

Використання teeтакож дозволяє sudo JUST цієї команди, так що вам не доведеться перебирати весь оператор, як в sudo sh -c "echo foo > bar". teeтакож дозволяє розділити вихід. Звичайно, все це можна побачити в man tee. В основному це лише ваші особисті переваги.

Для подальшого читання дивіться тут і тут .


5
Роз'яснення на «Суд JUST , що команда», для тих , хто знайти цю маленький комплекс: використовуючи форму , як sudo somecommand >> fileaбуде працювати , sudo somecommandа потім, як викликає користувач, дописування вихід до filea. Використання sudo sh -c "somecommand >> filea"робіт, але може спричинити вкладення нічних кошмарів. Використання somecommand | sudo tee -a fileaзапускається somecommandяк користувач, fileaщо викликає , а потім додає результат як корінь - що зазвичай користувач хотів.
Дараель

@Darael Я редагував публікацію. Дякую вам за уточнення.
Каз Вулф
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.