В чем разница между STDIN и аргументами, переданными команде?

Я мог бы использовать любую форму для выполнения метода cat :

 cat file_name cat < file_name 

Результат тот же

Затем я хочу исполнить man в формате stdin

 man < file_name 

Хотя file_name содержит:

 # file_name cat 

Но он всплывает. What manual page do you want? а не казнить man cat .

Я хочу знать, почему cat может принимать stdin качестве аргументов, но man не может этого сделать. И в чем разница между аргументами командной строки и stdin ?

  • Перенаправление / grep'ing STDOUT существующей оболочки
  • Ошибка перенаправления Sub Shell с переменной (while ...) $ 3> $ testdir / $ testfile.log
  • Перенаправить вывод на полпути через скрипт и восстановить позже
  • Как реализовать отложенное stdout в дочернем процессе без использования временных файлов?
  • Копировать вывод curl в файл
  • Маркировка команды в качестве переменной для повторного использования внутри каналов или отдельных команд
  • запускать команду как другого пользователя с доступными разрешениями sudo
  • команда, как wc, но с тиковым поведением
  • 2 Solutions collect form web for “В чем разница между STDIN и аргументами, переданными команде?”

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

    Если первое слово в командной строке представляет собой программу, расположенную в специальной папке (в основном, определяемой PATH ), и не задано больше специальных символов (зависит от используемой оболочки), все последующие слова, разделенные пробелами или вкладками, передаются к программе в специальной форме, то есть массиве. С каждым словом в качестве одного элемента массива.

    Как программа, которую вы собираетесь вызывать, интерпретирует аргументы (расположенные в массиве), зависит от того, как она запрограммирована. Существуют некоторые квазистандарты того, как должен выглядеть синтаксис аргументов, но в целом программист свободен. Таким образом, первый аргумент может быть истолкован как имя файла или любые мысли программиста в то время, когда он написал программу.

    В случае добавления специального символа < или > в командную строку оболочка не добавляет < и > и последующие слова в массив, который будет передан программе. С помощью < or > если оболочка начинает создавать причудливые вещи, поддерживаемые базовым ядром (ключевое слово). Чтобы понять, что происходит, вы должны понять, что такое STDIN и STDOUT (так как это не сразу связано с пропуском STDERR ).

    Все видимое, которое вы видите на своем терминале (в большинстве случаев – часть вашего дисплея), либо написано оболочкой, либо любой другой программой, которую вы ранее вызывали в специальный файл (в unix все это файл ). Этот файл имеет специальный идентификатор и называется STDOUT . Если программа хочет читать данные с клавиатуры, она не проводит опрос клавиатуры напрямую (по крайней мере, в большинстве случаев), но читает из специального файла STDIN . Внутренне этот файл в большинстве случаев подключен к вашему стандартному устройству ввода, вашей клавиатуре.

    Если оболочка читает < или > в анализируемой командной строке, она обрабатывает STDIN или STDOUT в определенном виде за время выполнения соответствующей программы. STDIN и STDOUT указывают на терминал или стандартное устройство ввода, а скорее на последующее имя файла в командной строке.

    В случае двух линий

     cat file_name cat < file_name 

    наблюдаемое поведение идентично, потому что соответствующий разработчик заставляет cat либо считывать данные из STDIN либо читать данные из файла, имя которого дано в качестве первого аргумента командной строки (который является первым элементом в массиве, который оболочка передает cat ) , Впоследствии cat записывает весь контент имени file_name или STDIN на терминал, поскольку мы не инструктируем оболочку управлять STDOUT . Помните, что во второй строке ваша оболочка управляет STDIN таким образом, что она больше не указывает на ваше стандартное устройство ввода, но указывает на файл с именем file_name в вашем текущем рабочем каталоге.

    В другом случае линии

     man < file_name 

    man не должен ничего читать от STDIN если он вызван без аргумента, то есть пустого массива. Таким образом, линия

     man < file_name 

    равняется

     man 

    Например, man будет читать что-то из STDIN , тоже, если вы передадите -l - man . С помощью этой опции, указанной в командной строке, вы можете отображать содержимое всего, что man читает из STDIN на вашем терминале. Так

     man -l - < file_name 

    также будет работать (но будьте осторожны, man не просто пейджер, но также анализирует ввод файла, поэтому содержимое файла и отображаемый контент могут отличаться).

    Итак, как интерпретируются STDIN , STDOUT и аргументы командной строки, все зависит от соответствующего разработчика.

    Надеюсь, мой ответ может прояснить ситуацию.

    Они совершенно разные. Аргументы командной строки передаются в программу в массиве и могут делать с ними что угодно; stdin – это входной поток, с которым программа должна запрашивать данные. Программы, которые обрабатывают файлы, часто предпочитают поддерживать их, но они должны сделать это вручную – они проверяют, было ли имя файла передано как аргумент командной строки, и если они не читаются из stdin вместо

    Кажется, вы ожидаете, что man прочитает stdin, чтобы найти страницу руководства, которую он должен отобразить, что было бы действительно странным поведением; когда вы когда-нибудь будете использовать это? Тот факт, что cat отображает свой stdin, является артефактом того факта, что он ничего не делает; Я не думаю, что любой другой инструмент работает именно так. Например, grep может принимать имя файла или читать из stdin , но он обрабатывает данные на stdin , он не читает имя файла из stdin а затем открывает его

    Если вам действительно нужно это поведение, вы можете использовать xargs , который преобразует файл в аргументы командной строки:

     $ xargs man < file_name 

    Или просто вставьте cat вызов в man звонок:

     $ man $(cat file_name) 
    Interesting Posts

    После установки нового ядра в Ubuntu 14.04 перезагрузка приведет меня к initramfs busybox. Как смонтировать файловую систему после этого?

    Fluxbox: как сопоставить ключ для снятия снимков с выбранной области?

    Как преобразовать персидские цифры в UTF-8 в европейские цифры в ASCII?

    stout не может присоединяться к большим файлам

    поиск точной строки в unix

    Отключение расширения сервера Xorg во время выполнения (для новых клиентов)?

    GRUB на MBR внутреннего диска Windows, с дистрибутивами на внешнем диске

    Почему vim не запрашивает пароль при повторном открытии зашифрованного файла?

    Справка по использованию Shell

    Как заставить пользователя сменить пароль при первом входе в систему с помощью ssh?

    Как установить инструменты, пакеты в Linux 3.0.8 armv7l?

    Solaris – постоянно обновляет PATH для всех пользователей

    Почему компакт-диск Debian имеет 52 CD

    Создание пустого файла с именем переменной в скрипте

    Что происходит, когда вы удаляете жесткую ссылку?

    Linux и Unix - лучшая ОС в мире.