Intereting Posts
Истинный HTTPS? Как? Как фильтровать линии, проходящие через трубу? Будет ли у `mv` возможность создавать каталоги? Ограничение пользователей с помощью неработающих групп (для меня) Как отключить USB-накопитель, когда самба не использует его Выполнить строку с переменными как команду Как передать журнал переменных в качестве аргумента скрипту? Безопасно ли выполнять полное резервное копирование системы с помощью tar на файловой системе ext4? Удалите все, кроме последнего файла резервной копии, в месяц Логротат не работает Уменьшение нагрузки на сервер Какая команда откроет браузер по умолчанию в системе на заданную веб-страницу (терминал)? Подключение к последовательному порту с VMWare ESXi и Ubuntu Используя sshpass, код возврата (статус выхода) отличается по неизвестным причинам с использованием допустимых команд Создание точных немасштабированных буклетов с pdfbook автоматически

труба в оболочке с перенаправлением

Я понимаю, что труба в оболочке похожа a | b a | b перенаправляет b 'sddin на stdout. Однако я попробовал ls | less < somefile ls | less < somefile , поведение очень странно. less показывает вывод ls конкатенированный содержимым somefile .

Может ли кто-нибудь объяснить это явление?

Ваше понимание не совсем правильно. В a | b a | b выходное сообщение stdout процесса, связанное через трубу, в stdin процесса b . Проблема с вашим кодом заключается в том, что при дополнительном перенаправлении из somefile в процесс b вы будете использовать два разных метода одновременно для подключения к stdin процесса b . Не делай этого! Вопрос в том; что вы пытаетесь достичь (с такой конструкцией) в первую очередь?

Вы не говорите, какую оболочку используете. Из поведения, которое вы описываете, вероятно, zsh . Если вы посмотрите на странице своего руководства, вы заметите, как обрабатываются перенаправления.

Обратите внимание, что канал является неявным перенаправлением; таким образом

  cat bar | sort <foo 

эквивалентно cat bar foo | sort cat bar foo | sort (обратите внимание на порядок входов).

В противном случае регулярное поведение, например, одно из bash состоит в том, что каждое перенаправление заменяет предыдущее перенаправление для этого файлового дескриптора.

Страница zsh man продолжает:

Если параметр MULTIOS не установлен, каждое перенаправление заменяет предыдущее перенаправление для этого файлового дескриптора. Однако все перенаправленные файлы фактически открыты, поэтому

  echo foo > bar > baz 

когда MULTIOS будет отменен, будет усекать бар и записать `foo 'в baz.

потому что вы принимаете меньше информации от somefile.

он работает так

1 -> выполнить ls, так как вы использовали pipe, он будет вывести stdout на stdin следующей команды: это то, что вы говорите

2 -> он будет выглядеть второй командой .. меньше <somefile

как только он увидит '<' перенаправление, он снова изменит stdin в файл … Следовательно, ваше предыдущее изменение из-за '|' теряется.

ну, вы можете сказать это так: меньше принимали входные данные из файла, это не имеет никакого отношения к выходу ls.