Почему не работает перенаправление вывода из nginx?

Я хочу перечислить все модули сервера nginx построчно, поэтому набираю следующее:

nginx -V | tr -- - '\n'

Но это не помещает модули в линии. Если я сделаю это так:

2>&1 nginx -V | tr -- - '\n'

оно работает. Но почему?

1 ответ

Решение

То, что вы наблюдаете, указывает на то, что nginx -V записывает свой вывод в стандартный поток ошибок (он же stderr - по файловому дескриптору 2) а не стандартный поток вывода (ака stdout - дескриптор файла 1). Только stdout проходит через трубу | Так что ваши tr команда не получает его.

2>&1 синтаксис говорит оболочке перенаправить stderr в stdout чтобы потом tr, К вашему сведению, размещение, которое вы использовали, является синтаксически законным, но нетрадиционным - чаще всего такой вид перенаправления будет записан как

nginx -V 2>&1 | tr -- - '\n'

Кстати, труба | действительно перенаправляет вывод первой команды, а не ввод второй, которая поступает из стандартного потока ввода (stdin - дескриптор файла 0) по-прежнему.

Другие вопросы по тегам