Есть ли какое-либо значение для использования тройника?

47

Почему почти все инструкции относительно добавления текста в системные файлы, такие как fstabи /etc/apt/sources.list.d/<name>.listвключают использование tee и echo добавление указанного текста?

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

## 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
Вам не хватает sudo в ваших командах; что покажет разные результаты между 2;)
Rinzwind
1
@Rinzwind Я запускаю эти команды как root.
Алексей Магура

Ответы:

84

Есть разница: тройник дублирует вывод: он отправляет его как в файл, так и на дисплей.

Но есть еще:

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

     echo "some text" | tee file1 > file2  
    
  • Еще одна вещь, которая может вам помочь, - это избежать одной проблемы при использовании sudo. Обычный оператор перенаправления вывода всегда выполняется с вашими правами пользователя, даже когда вы пишете sudo перед командой, которая генерирует текст STDOUT. Другими словами, это не удастся, если у вас нет разрешения на запись в этот файл:

     sudo echo "something" > bar  
    

    Но с тройником все пойдет хорошо

    echo "something" | sudo tee bar  
    

2 примера с этого сайта . Это еще немного.

Rinzwind
источник
Можно sudoбез tee- sudo sh -c 'echo SOMETHING > FILE'...;)
Уилф
7
@wilf да, но когда вам нужно вывести кавычки ", все становится грязно
Брайам
3
В первом случае, если вы хотите записать в N файлов, я бы предпочел echo "some text" | tee file1 file2 ... fileNи, возможно, добавил > /dev/null, если вы не хотите, чтобы беспорядок на stdout.
Эльмар Цандер
Хороший @ElmarZander :)
Rinzwind
13

teeберет стандартный поток ввода и записывает его как в стандартный поток вывода, так и в поток файла. Если это помогает людям помнить, имя команды происходит от Т-сплиттера в сантехнике. Есть хорошая статья в Википедии, где я узнал о происхождении названия команды.

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

user391339
источник
11

Прежде всего, teeсам текст не добавляет и не добавляет >.

Именно tee -aи дополняет, >>что добавляет текст.

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

Если вы используете (мой личный фаворит) bash, >и >>гораздо приятнее / проще.

Использование teeтакже позволяет вам sudo ПРОСТО эту команду, так что вам не нужно sudo весь оператор, как в sudo sh -c "echo foo > bar". teeтакже позволяет разделить вывод. Конечно, все это можно увидеть в man tee. Это в основном только ваши личные предпочтения.

Для дальнейшего чтения смотрите здесь и здесь .

Каз Вулф
источник
5
Разъяснение «sudo JUST that command», для любого, кто считает это немного сложным: при sudo somecommand >> fileaзапуске запускается подобная форма , sudo somecommandа затем, в качестве вызывающего пользователя, добавляются выходные данные filea. Использование sudo sh -c "somecommand >> filea"работает, но может вызвать кошмары с вложенными цитатами. Использование somecommand | sudo tee -a fileaзапускается somecommandот имени вызывающего пользователя, а затем добавляет выходные данные в fileaкачестве пользователя root - что обычно и требуется пользователю.
Дараэль
@Darael Я редактировал пост. Спасибо за разъяснения.
Каз Вулф