%20%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%BC%20%D0%B8%D0%BB%D0%B8%20%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%BE%D0%B9%3F.png)
Я не могу найти никакой официальной документации, которая ссылается на это как на одно или другое. В чем, собственно, заключается техническое различие между командой и оператором?
решение1
В тексте POSIX это указано под заголовком2.6 Расширения слов, а также расширение тильды, расширение параметров, арифметическое расширение, разделение полей, расширение имени пути и удаление кавычек.
Аналогично руководство Bash перечисляет это в разделеРасширения Shell.
В первом случае для операторов перенаправления используется "оператор", а также ;
, &
, |
, &&
, ||
, (
и т. д., так что это не один из них. Это также, очевидно, не команда, поэтому, как бы ни была важна терминология, я бы сказал, что это ни то, ни другое.
решение2
Команда:
обычно имеет буквенно-цифровую строку в качестве имени.
является либо внешней утилитой, либо встроенной, либо функцией. Почти все,
type
для чего встроенная функция производит вывод, является командой в этом смысле.имеетпрефикснотация.
обычно изменяет какой-то тип ввода-вывода.
Оператор:
обычно представляет собой символьную строку и может не иметь имени, но может иметь псевдоним.
не понимается
type
встроенной функцией (если только это не какая-то функция или скрипт с непонятным названием).чаще имеетинфиксилисуффикссинтаксис.
иногда управляет вводом/выводом как регулировщик, но не меняет то, что происходитвэто.
иногда определяет порядок процессов.
$()
это командазамена:
- Прежде всего (или в последнюю очередь, в зависимости от того, как мы на это смотрим), это строка.
- строка состоит из текставыходиз перечисленных внутри команд.
[
встроенная команда оболочки:
- это
test
команда с обязательным]
суффиксом.
[[
является bash
ключевым словом оболочки:
- Это похоже на более универсальную и быструю
[
встроенную функцию, но, насколько мне известно, у нее нет соответствующейtest
команды -like. Ключевые слова оболочки включают такие вещи, как
time
иfor
, которые выглядят как команды, но ведут себя скорее как операторы, которым требуются различные родственные ключевые слова в качестве разделителей и синтаксиса. Этот код запускаетtype
встроенную функцию на выходе встроенной функцииhelp
, которая показывает список левосторонних ключевых слов и встроенных функций:COLUMNS=30 help -m | tail -n +9 | tee >(cut -d ' ' -f2) >(cut -c 17-30 | cut -d ' ' -f1) > /dev/null | sort | sed -n "s/.*/type '&'/e"';/found/!p'
Сравнивая с разговорным языком:
- команды (и некоторые ключевые слова) подобны глаголам.
- файлы и строки — это существительные.
- Операторы подобны знакам препинания и предлогам.
В абстрактном смысле операторы — это просто команды с другим синтаксисом, которые можно заменить на аналогичные.префикскоманды стиля вместе с остальными. Вероятно, это было бы не так удобно использовать.
Аналитически скомпилированный код оболочки можно пропустить через дизассемблер, а операторы снова будут просто командами или, скорее, серией команд языка ассемблера.
решение3
С точки зрения пользователя, подстановка команды — это своего рода примитив оболочки. Это функция, реализованная в оболочке, которая выполняет несколько действий (запускает подоболочку, выполняет команду...) и возвращает значение (вывод команды). До того, как оболочка выполнит расширения, подстановка команды обычно является аргументом команды. Другими словами, пользователь получает результат процесса оболочки, используя функцию оболочки.