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


19

Я шукав різницю між adduserі useradd, і пояснення полягає в тому, що useraddце команда, а adduserсценарій perl. Я розумію, що таке сценарій perl, але те, що я не розумію, це те, що саме commandтоді.

Я завжди вважав , що команди типу ls, ln, і cdт.д., все прості програми , написані на будь-якій мові , який просто зробити одну річ. Яка різниця між цими "простими програмами" та сценарієм Perl?

Я, звичайно, знаю, що сценарій (perl) не компілюється, а інтерпретується під час виконання, але я думаю, що це не єдина різниця?


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

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

Відповіді:


32

Простіше кажучи, команда - це інструкція (або набір інструкцій), яка повинна виконуватися комп'ютером.

Автономні команди

Основні утиліти Unix, такі як lsі lnт.д., (як правило) записуються на С та складаються як автономні виконувані програми , які не потребують виконання інтерпретатора; Зазвичай вони вимагають встановити певні бібліотечні файли в системі, але це відповідь на інше питання.

Сценарії

Сценарій - це сукупність команд і насправді самі сценарії вважаються командою.

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

Іноді великі та складні інтерпретаційні сценарії (такими мовами, як Perl, Python та Ruby) також називаються інтерпретованими програмами, тоді як термін script зарезервований для коротших та простіших сценаріїв.

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

Bash - сумісний з інтерпретатором мови мов команд, який виконує команди, прочитані зі стандартного вводу або з файлу.

Вбудовані корпуси

Оболонки зазвичай мають вбудовані команди, які не є ні окремими програмами, ні сценаріями. Натомість вони є частиною самої оболонки і управляються безпосередньо оболонкою. 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. Ви не знайдете відлуння * в вікнах , як це чисто команда CMD оболонки (відлуння в PowerShell є псевдонімом для запису-об'єкта).
Джим B

@JimB Це правда. Я редагував останній рядок, щоб уточнити, що я мав на увазі. Випадково я тільки що почав вивчати PowerShell цього тижня (на щастя, мені не довелося працювати з .batфайлами вже багато, багато років).
Ентоні Г - справедливість для Моніки

2

Вбудована команда є частиною оболонки. Програма виконується оболонкою.

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

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


Але useraddце не вбудована оболонка. Веб-сайт щойно сказав "команда", а не "вбудована команда". Наскільки це пояснення стосується цього питання?
Бармар

1

Команда просто означає спосіб сказати програмі чи системі щось зробити.

Додаток, як правило, приймає багато різних команд, від GUI, від stdin, але можливі й інші методи, наприклад, UNIX-розетка або названа труба, якийсь веб-API, з'єднання RPC або якийсь інший спеціальний протокол.

Додаток, який виконує лише одне, потім виходить, зазвичай без графічного інтерфейсу, також можна назвати командою, тому що ви дійсно можете "дати" цій програмі лише одну значущу "команду". Ось як такі маленькі програми люблять lsі такі працюють, і чому їх називають командами.

Але ви б не називали Photoshop командою, але ви, безумовно, видавали команди в ній через GUI.

Однак термін може означати різні речі для різних людей. У вашому прикладі команда використовується для опису виконуваного файлу, який запускається безпосередньо, порівняно з файлом, для якого потрібен інтерпретатор сценарію. Відмінність може бути важливою, тому що, коли ви запускаєте сценарій Perl, /usr/bin/perlце двійковий файл, який насправді працює (тому, якщо ви хочете вбити тривалий сценарій Perl, це те, що вам потрібно шукати ps). Однак у більшості оболонок є "вбудовані" команди, які є командами для самої оболонки і не викликають запуск зовнішнього виконуваного файлу. Наприклад, cdобробляється bashсамостійно і не викликає /sbin/cdабо подібне.


Цікава перспектива. На рівні абстракції, з якого ви переглядаєте це, я спокушаюсь назвати це "викликом" або "жестом" або навіть перейти з термінологією андроїда "наміром". Це сказав, що я не знаю, чи мені подобається ідея зробити компільований vs інтерпретований критерій. Наприклад, Powershell є інтерпретованою гібридною (, Net), але як оболонка, вона має команди у своїй кодовій базі. але тоді ви добре зазначаєте, що зовнішні компільовані (машинний код) виконувані файли відрізняються від сценаріїв, але й команд. як я вже сказав, цікава перспектива.
Френк Томас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.