В чем разница между 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 ?

  • пароль для паролей `sudo` и другие данные для команды sudo`ed
  • Могу ли я написать вывод команды разницы времени в файл?
  • Почему я не могу сделать ls -a 1> & -?
  • В командной строке я могу перенаправить вывод в файл WITHOUT>, >> или | операторы?
  • Как использовать трубку для применения текста к программе
  • Вывод скрипта в зависимости от параметра
  • Bash, если скрипт вызывается из терминала echo stdout в терминал, если из cron не выводит эхо-сигнал
  • См. Перенаправление STDOUT текущего процесса
  • 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

    Ограничить вывод из непрерывного процесса

    Почему эти бомбы вилки-ракеты работают по-разному, и каково значение & в ней?

    Как определить ошибку в определенном файле при проверке контрольной суммы (какой файл имеет проблему при проверке) в сценарии оболочки

    Не удалось выполнить скомпилированную программу C

    Можно ли сохранить состояние открытых терминалов?

    apt-get не будет установлен: dpkg: список файлов для пакета 'gnome-themes-standard-data' не является обычным файлом

    Как заставить оболочку отображаться в моем собственном дистрибутиве (linux)?

    Не удается запустить библиотеки python из-за проблем с python 2/3

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

    Как мы можем заставить Squid сделать обратный nslookup?

    Git висит бесконечно, пытаясь нажать – all to GitHub

    Где я должен установить внешний жесткий диск?

    undefined symbol в /usr/lib64/libGL.so.1 при использовании ssh

    Получите строку и поместите ее в начале строки, пока не будет найдена следующая строка

    Как выйти из системы, когда рабочий стол замерзает?

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