Что делает «1 <»? - PullRequest
       30

Что делает «1 <»?

0 голосов
/ 17 января 2019

Я пытаюсь понять, как оболочка немного лучше обрабатывает перенаправление. Насколько я понимаю, синтаксис «n <» означает перенаправление файлового дескриптора, заданного «n». </p>

Команда, которую я пытаюсь понять, это

echo "first" > test; echo "second" 1< test

Я думал, что произойдет, что файл "test" будет перезаписан текстом "first"; затем, когда вторая команда будет выполнена, 1 - т.е. stdout - будет перенаправлен для проверки.

На самом деле происходит следующее:

  1. Ничего не пишет в терминал, поэтому stdout был перенаправлен куда-то ;
  2. Когда я открываю «test», написано «первый», а не «второй», поэтому я не перезаписывал «test».

Может кто-нибудь объяснить, что происходит? Это то, что stdout перенаправляется для тестирования, но в режиме «только для чтения» или что-то в этом роде? Я не могу найти ссылки на использование 1< в сценарии в другом месте (поскольку, по общему признанию, это кажется странным, что нужно сделать).

1 Ответ

0 голосов
/ 17 января 2019

Перенаправление оболочки 1<foo делает FD 1, он же stdout - обычно дескриптор output - подключенным к дескриптору только для чтения в файле foo.

Таким образом, когда echo пытается записать в этот дескриптор только для чтения , произойдет сбой; в большинстве разумных оболочек это также приводит к выводу сообщения об ошибке в stderr.

В этом контексте этот код не имеет смысла и является просто ошибкой; вам понадобится программа, которая пытается прочитать с FD 1 (возможно, предполагая, что это соединение с текущим терминалом), чтобы она имела смысл. (Тем не менее, любая программа, которая сделала это, сама была бы глючной; чтение должно быть выполнено, если не через FD 0, из дескриптора, прямого на /dev/tty).

...