星 «Звезда» 1999

Два вывода программы

В терминале: zvezda learn streams. Урок покажет карточку и завершится; сделайте шаг и снова запустите урок - он проверит и покажет следующую.

Шаг 1 из 4

Дарья: Я долго не понимала, откуда у программы «два вывода». Кэндзи объяснил: 1 - обычный вывод (stdout), 2 - ошибки и служебное (stderr). На экране они смешиваются. Запустите:

zv-noisy

Где-то в шуме мелькнёт слово - его легко пропустить. Спрячьте обычный вывод (поток 1):

zv-noisy > /dev/null

Шаг 2 из 4

Дарья: Теперь сохраните только поток 2 в файл - для этого 2>:

zv-noisy 2> ~/zvezda/learn/err.txt
cat ~/zvezda/learn/err.txt

Шум при этом останется на экране: он идёт в поток 1.

Шаг 3 из 4 (продолжение)

Дарья: Основа пройдена - хватит для задания 18. Дальше - для задания 19: оба потока в один файл. Кэндзи записал: «2>&1 - это поток 2 туда же, куда СЕЙЧАС направлен поток 1», поэтому порядок важен:

zv-noisy > ~/zvezda/learn/all.txt 2>&1

Наоборот (2>&1 > all.txt) не сработает - я сама так ошиблась.

Шаг 4 из 4 (продолжение)

Дарья: И tee - сразу и на экран, и в файл. Конвейер | передаёт только поток 1, поэтому 2>&1 ставят перед |:

zv-noisy 2>&1 | tee ~/zvezda/learn/tee.txt

Шпаргалка

> файл          - поток 1 (обычный вывод) в файл
2> файл         - поток 2 (ошибки, служебное) в файл
> /dev/null     - выбросить поток 1, на экране останется поток 2
> файл 2>&1     - оба потока в файл (порядок важен!)
2>&1 | tee файл - оба потока и на экран, и в файл