вторник, 17 ноября 2020 г.

Почему в выводе echo командной строки с перенаправлением появляется 1? Кто вставляет эти единицы?

Это перевод Why does my command line redirection echo with an extra 1? Who’s inserting these rogue 1s everywhere? Автор: Реймонд Чен.

Если вы оставите включённым режим echo в командном файле, и командный файл выполняет команду с перенаправлением, тогда в выводе появится загадочная единичка.

C:\> copy con %TEMP%\test.cmd
dir >nul
^Z
        1 file(s) copied.

C:\> %TEMP%\test.cmd

C:\> dir  1>nul
          
          🤨
Изгой 1 оказывается чисто визуальным. В командной строке нет единички. В примере выше список каталогов относится к текущему каталогу, а не к каталогу с именем 1.

Но откуда тогда берётся эта единица?

Вспомните, что цифры перед оператором перенаправления указывают перенаправляемый поток (это одна из причин, по которой у меня есть привычка помещать перенаправление в начало командной строки).

По умолчанию, если поток не указан, перенаправляется поток stdout, а номер потока stdout… 1.

Так, головоломка начинает складываться.

Если включён режим echo, командный процессор выводит каждую команду перед ее выполнением. Но это происходит после того, как командная строка будет проанализирована. А во время синтаксического анализа оператор перенаправления запоминает какой поток перенаправляется. Командный процессор восстанавливает исходную командную строку для вывода из результатов анализа, поэтому когда он видит оператор перенаправления, он послушно помещает вперёд номер потока из анализа.

Если вы не указали явный поток для перенаправления, будет распечатан поток по умолчанию (stdout = 1), потому что именно этот поток перенаправляется.

Это просто причуда. На функциональность это не влияет. Хотя это выглядит немного странно, когда вы замечаете это в первый раз.

Комментариев нет:

Отправка комментария

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку.

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

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