Является ли синтаксис подстановки команд $() оператором или командой?

Является ли синтаксис подстановки команд $() оператором или командой?

Я не могу найти никакой официальной документации, которая ссылается на это как на одно или другое. В чем, собственно, заключается техническое различие между командой и оператором?

решение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

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

Связанный контент