Команда против программы?


19

Я искал разницу между adduserи useradd, и объяснение в том, что useraddэто команда, в то время adduserкак Perl-скрипт. Я понимаю, что такое Perl-скрипт, но я не понимаю, что это commandтакое.

Я всегда думал, что такие команды, как ls, lnи cdт. Д., Все простые программы, написанные на любом языке, которые просто делают одну вещь. В чем разница между этими "простыми программами" и сценарием perl?

Я, конечно, знаю, что (perl) скрипт не компилируется, а интерпретируется во время выполнения, но я думаю, что это не единственная разница?


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

Проще говоря: команда - это все, что может выполняться, а программа - исполняемый файл.
Питикос

Ответы:


32

Проще говоря, команда - это инструкция (или набор инструкций), выполняемая компьютером.

Автономные команды

Фундаментальные утилиты Unix, такие как ls, lnи т. Д. (Обычно) написаны на C и скомпилированы для того, чтобы быть автономными исполняемыми программами , для которых не требуется выполнение интерпретатора; они обычно требуют, чтобы определенные библиотечные файлы были установлены в системе, но это ответ на другой вопрос.

Сценарии

Сценарий - это набор команд, и фактически сами сценарии считаются командой.

Perl скрипт представляет собой последовательность операторов Perl и требует perlисполняемой (автономной и компилируются) программы для интерпретации заявления Perl.

Иногда большие и сложные интерпретирующие сценарии (в таких языках, как Perl, Python и Ruby) также называют интерпретируемыми программами, в то время как термин сценарий зарезервирован для более коротких и простых сценариев.

Сценарий оболочки представляет собой последовательность других команд (любой тип команды) , и это требует Unix оболочки , такие как Bash интерпретировать сценарий. Со страницы руководства Bash:

Bash - это совместимый с sh интерпретатор языка команд, который выполняет команды, считанные из стандартного ввода или из файла.

Встроенные оболочки

Оболочки обычно имеют встроенные команды, которые не являются ни автономными программами, ни скриптами. Вместо этого они являются частью самой оболочки и запускаются непосредственно оболочкой. cdэто пример такой встроенной команды.

Иногда существуют команды, которые существуют как встроенные в оболочку и как отдельные команды одновременно, например, echoкоманда.

$ type -a echo
echo is a shell builtin
echo is /usr/bin/echo

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

Запустите встроенную версию echo:

$ echo --version
--version

Запустить автономную echoпрограмму:

$ /usr/bin/echo --version
echo (GNU coreutils) 8.23
Packaged by Cygwin (8.23-4)
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Примечание. Приведенные выше особенности относятся к среде Unix, но те же принципы применимы к среде Windows.


Эхо, на которое вы ссылаетесь в Windows, только при установке Cygwin. Вы не найдете echo. * В Windows, поскольку это просто команда оболочки CMD (echo в powershell связан с write-object)
Джим Б.

@JimB Это правда. Я отредактировал последнюю строку, чтобы уточнить, что я имел в виду. По совпадению, я только начал изучать PowerShell на этой неделе (к счастью, мне не приходилось работать с .batфайлами много-много лет).
Энтони Дж. - справедливость для Моники

2

Встроенная команда является частью оболочки. Программа выполняется оболочкой.

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

http://www.gnu.org/software/bash/manual/bashref.html#Shell-Builtin-Commands


Но useraddэто не встроенная оболочка. На сайте просто сказано «команда», а не «встроенная команда». Насколько это объяснение относится к этому вопросу?
Бармар

1

Команда просто означает, что приложение или система должны что-то делать.

Приложение обычно принимает много различных команд, либо из графического интерфейса пользователя, stdinно возможны и другие методы, например, сокет UNIX или именованный канал, какой-то веб-API, RPC-соединение или какой-либо другой пользовательский протокол.

Приложение, которое выполняет только одно, а затем завершает работу, обычно без графического интерфейса, также можно назвать командой, потому что вы действительно можете «дать» этому приложению только одну значимую «команду». Вот как lsработают такие маленькие программы и почему они называются командами.

Но вы не назвали бы Photoshop командой, но вы наверняка бы дали команды внутри нее через графический интерфейс.

Тем не менее, термин может означать разные вещи для разных людей. В вашем примере команда используется для описания исполняемого файла, который запускается напрямую, в отличие от файла, для работы которого требуется интерпретатор сценариев. Различие может быть важным, потому что когда вы запускаете Perl-скрипт, это исполняемый /usr/bin/perlфайл, который на самом деле выполняется (поэтому, если вы хотите уничтожить долго работающий Perl-скрипт, это то, что вам нужно искать ps). Однако большинство оболочек имеют «встроенные» команды, которые являются командами самой оболочки и не запускают внешний исполняемый файл. Например, cdобрабатывается bashсам по себе и не вызывает /sbin/cdили подобный.


Интересная перспектива. На уровне абстракции, с которого вы просматриваете это, я испытываю желание назвать это «вызовом» или «жестом» или даже использовать терминологию андроида как «намерение». Тем не менее, я не знаю, нравится ли мне идея сделать скомпилированный или интерпретированный критерии. Например, Powershell является гибридно-интерпретируемым (Net), но в качестве оболочки он имеет команды в своей кодовой базе. но затем вы должны подчеркнуть, что внешние скомпилированные (машинный код) исполняемые файлы отличаются от сценариев, но также и команд. как я уже сказал, интересная перспектива.
Фрэнк Томас
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.