1

Кто-нибудь может объяснить следующее?

:~$ ls macreave.sh fgvdvg > testo 2> testo
:~$ cat testo 
macreave.sh 
ccess fgvdvg: No such file or directory 

:~$ ls macreave.sh fgvdvg > testo 2>&1
:~$ cat testo 
ls: cannot access fgvdvg: No such file or directory 
macreave.sh 

Делая это первым способом, он съедает первые несколько символов сообщения об ошибке, второй способ показывает это просто отлично. Это почему?

1 ответ1

1

Со второй командой

:~$ ls macreave.sh fgvdvg > testo 2>&1

вы заставите вывод stderr ls записываться в тот же файловый дескриптор, что и stdout (2>&1), и stdout в файл testo: так что у вас есть уникальный поток, который заканчивается в вашем файле.

Вместо первой команды

ls macreave.sh fgvdvg > testo 2> testo

Вы перенаправляете самостоятельно на один и тот же файл testo . Проблема в том, что трубопроводы и перенаправления могут быть асинхронными (см. Также этот ответ); у вас есть 2 потока, которые заканчиваются в вашем файле и воссоздают его.

Кажется, что:

  • тем быстрее было stderror (на несколько байт), который создает файл testo (>) и пишет в ls:
  • затем прибывает стандартный вывод, воссоздающий тот же файл (>), стирающий то, что внутри, и помещающий вывод macreave.sh
  • наконец, пришла вторая часть stderr, которая записывает в файл то, что остается ccess fgvdvg: такого файла или каталога нет.

Возможно, если вы выполните снова, у вас будет другой результат.

Рекомендации

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