Со второй командой
:~$ 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: такого файла или каталога нет.
Возможно, если вы выполните снова, у вас будет другой результат.
Рекомендации