Почему не работает перенаправление вывода из 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) по-прежнему.