1

Я знаю, что к процессу прилагается 3 потока, а именно поток ввода, вывода и потока ошибок.

И перенаправление выполнения работ слева направо.

Я намерен выполнить команду, перенаправить ее поток вывода в файл, а поток ошибок - в тот же файл.

- nofile не существует, файл text1 существует

head nofile text1 1> output.txt 2> output.txt  -- I know this won't work.

head nofile text1 1> output.txt 2>&1 -- while this will work, passing the error stream to the output ste

q1) почему?

Если речь идет о "это должно быть написано так", то почему не может работать ниже

head nofile text1 2>&1 1> output.txt
head nofile text1 2>&1> output.txt

Выше я перенаправляю поток ошибок в выходной поток, выходной поток в файл. Его логика та же, что и выше.

1 ответ1

0

Ответ № 1: расовый конфликт

  • head nofile text1 1> output.txt 2> output.txt # - я знаю, что это не сработает.`

Это на самом деле работает, даже если не так, как вы ожидали, и не соответствует вашей цели.
У вас есть 2 дескриптора файла, которые будут перенаправлены независимо в один и тот же выходной файл с помощью > output.txt .
Один дескриптор файла будет действовать быстрее: он создаст файл output.txt и начнет писать внутри него.
Когда второй дескриптор файла начнет действовать, он воссоздает тот же файл (> output.txt), стирая то, что внутри.
Вы потеряете первую часть, написанную первым дескриптором файла, если таковая имеется.
Ожидайте искаженный вывод, особенно с длинными выходами. Смотрите этот ответ тоже .
Учтите, что поведение не всегда воспроизводимо. В моей системе сегодня файл создается с ошибкой внутри в виде первой строки и текста после.

  • head nofile text1 1> output.txt 2> & 1 # ok это работает

Это работает, потому что сначала вы меняете перенаправление для стандартного вывода на файл output.txt . Затем вы просите перенаправить стандартную ошибку в то же место назначения стандартного вывода, что означает файл output.txt .

Ответ № 2: вопросы заказа
Суть ответа: перенаправление bash не является коммутативным, это означает, что порядок имеет значение:

заголовок nofile text1 2> & 1 1> output.txt
заголовок nofile text1 2> & 1> output.txt

Здесь, прежде чем просить перенаправить стандартную ошибку на стандартный выходной адрес (вероятно, текущий tty). Затем вы просите изменить только стандартный вывод на выходной файл output.txt . (обе команды 1>output.txt и >output.txt действуют одинаково). Стандартная ошибка остается перенаправленной, где это было раньше (вероятно, текущий tty).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .