КРАТКОЕ СОДЕРЖАНИЕ

КРАТКОЕ СОДЕРЖАНИЕ

Словокомандаотносится к двум различным концепциям в Linux:

  1. Исполняемая программа, напримергрэп(или встроенная оболочка, напримерCD). Пример использования: «Вот 10 лучших команд Linux, которые вам следует изучить».
  2. Полная текстовая строка, отправляемая в оболочку для выполнения, напримерgrep com /etc/hosts. Пример использования: «Введите команду Linux и нажмите Enter».

Есть ли у кого-нибудь лучшие практики, чтобы избежать этой двусмысленности при написании прозы о командах Linux? Вот несколько попыток, которые я уже отклонил:

  • Используя словопрограммаилиисполняемыйдля значения № 1. Это неточно для встроенных функций оболочки.
  • Используя фразукомандная строкадля значения № 2. Это сбивает с толку, потому что «командная строка» также является синонимом «оболочки».
  • Используя фразукомандная строкадля значения № 2. Это неточно, потому что и № 1, и № 2 являются строками.

Буду признателен за любые советы.

решение1

POSIXотносится к вещам, которые похожи grepи cdкак "коммунальные услуги", ирезервы "команда"для инструкций. При последовательном использовании эти термины недвусмысленны.


Для рассмотрения ваших дел по очереди

  1. «Исполняемая программа, например grep (или встроенная в оболочку программа, например cd)»этополезность:

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

    Которыйдалее уточнено с:

    Система может реализовывать определенные утилиты как функции оболочки или встроенные утилиты.

    если быть точным, это включает в себя обычные утилиты, trueкоторые обычно встречаются как встроенные в оболочку.

    Формально, "специальные встроенные утилиты" отделены от утилит, которые не указаны далее; это такие вещи, как break, ., eval, set, и trap, которые влияют на внутреннее состояние оболочки, но онинеinclude cd, который является обычным встроенным. За исключением нюансов спецификации (определенное поведение назначения переменных отличается и недоступно с execvp), "utility" достаточно, чтобы охватить обе категории на уровне пользователя. Статьи синтаксиса оболочки, такие как ifи whileне являются утилитами вообще.

  2. "Полная текстовая строка, отправляемая в оболочку для выполнения, например grep com /etc/hosts"этокоманда:

    КомандаДиректива оболочке для выполнения определенной задачи.

    Команды включают простые команды, такие как grep com /etc/hosts, конвейеры и составные команды, такие как ifконструкции и групповые команды с ( ... ), но слово «команда» никогда не относится к самой утилите. В командеимя командыможет появиться , который идентифицирует утилиту или функцию: имя команды в grep com /etc/hostsэто grep, ссылаясь наутилита grep.


Просторечное использование слова «команда» для обозначения утилиты или функции может быть устранено контекстом, но формальное значение — только инструкция. Если требуется полное избегание двусмысленности,вы можете последовательно использовать «утилиту» и «команду»для этих двух ролей.

Однако вряд ли можно ожидать, что пользователи сами сделают это различие, поэтому оптимизированные для поисковых систем статьи «10 лучших команд Linux» скорее всего являются правильным выбором для их поощрений.

решение2

КРАТКОЕ СОДЕРЖАНИЕ

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


Исторический контекст

Указатель ранних изданийЯзык программирования C("K&R", Prentice-Hall) содержал только одно упоминание словакоманда, и не для этого слова конкретно, а дляаргументы командной строки. Это маленькое зерно смысла обеспечивает критическое семя, которое проросло и разветвилось во все последующие использования. Со страницы 111 одного издания 1978 года:

5.11 Аргументы командной строки

В средах, поддерживающих C, существует способ передачи аргументов командной строки или параметров программе при начале ее выполнения.

То есть, словокомандаиспользуется исключительно в контексте оболочки (поскольку оболочка по определению являетсяинтерпретатор команд), будь то в интерактивном использовании или в скриптовом программировании. Авторы продолжают с этим примером:

Простейшей иллюстрацией необходимых деклараций и использования является программа echo, которая просто повторяет свои аргументы командной строки в одной строке, разделенные пробелами. То есть, если команда

echo hello, world

дано, выход есть

 hello, world

Обратите внимание, как K&R говорит о программах и командных строках. Другими словами, это то, что IEEEPOSIX 1003.2это все о,нетчтоPOSIX 1003.1В общих чертах, Dot-1 охватывает программирование на языке C, тогда как Dot-2 охватывает программирование на языке shell.

И программирование оболочки, а не программирование на языке C, вот о чем вы здесь на самом деле говорите. Вот почему введение вРаздел 1 Руководства программиста Unixупоминает команды, а не вызовы функций:

ИМЯ

вступление — введение в общие команды (инструменты и утилиты)

ОПИСАНИЕ

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

Все команды устанавливают значение статуса при выходе, которое можно протестировать, чтобы увидеть, завершилась ли команда нормально. Значения выхода и их значения объясняются в отдельных руководствах. Традиционно значение 0 означает успешное завершение команды.

Если бы вы говорили на языке 1003.1, вы могли бы назвать это строковым аргументомthe системафункция в библиотеке C. Это потому, что это не сам системный вызов, а библиотечная функция, которая использует различные системные вызовы под капотом, один из которых — execve. Этот системный вызов принимает в качестве первого аргумента постоянный char *аргумент, представляющий собой путь к исполняемому файлу в файловой системе.

Опубликованные решения

В одном из опубликованных решений последовательно используются следующие определения:

запускаемый файл

Афайлкоторый специально отмечен, чтобы сообщитьОперационная системачто можно запустить этот файл как программу. Обычно сокращается до «исполняемый».

команда

Воболочкапрограммирование, синтаксическая комбинация имени программы и ее аргументов. Более свободно, все, что вы вводите в оболочку (командный интерпретатор), что запускает ее выполнение. [...]

аргументы командной строки

Значения, которые вы указываете вместе с именем программы, когда сообщаете оболочкавыполнитькоманда. [...]

имя команды

Имяпрограммав настоящее время выполняется, как указано накомандная строка. [...]

        Взято из четвертого изданияПрограммирование на Perl(O'Reilly) и здесь использовано с любезного разрешения авторов этой книги. :) .

Если вам повезет, вы сможете найти все это самостоятельно и даже больше, просто введя эту простую командную строку в свою оболочку, чтобы она запустиламужчинаисполняемый файл/программа для вас:

man perlglossary

Но если вам не так повезло,вы также можете найти их здесь.

Команды оболочки

Это может быть команда оболочки:

exec 2>errs.out

Обратите внимание, что execздесь ничего не сделано; мы просто переставили дескриптор файла.

То же самое и здесь:

exec 5<&0   # save old stdin
exec 0<&3   # read some_var
exec 0<&4   # read another_var
exec 0<&5   # restore it

Таким образом, каждая строка в скрипте является «командой», даже здесь (где я оставляю читателю в качестве упражнения, сколько реальных execveсистемных вызовов она порождает при полном запуске):

#!/bin/sh
device=/dev/rmt8
dd_noise='^[0-9]+\+[0-9]+ records (in|out)$'
exec 3>&1
status=`((dd if=$device ibs=64k 2>&1 1>&3 3>&- 4>&-; echo $? >&4) | egrep -v "$dd_noise" 1>&2 3>&- 4>&-) 4>&1`
exit $status

Взято из достопочтенного ИеремиадаПрограммирование Csh считается вредным, снова использовано здесь с любезного разрешения бла-бла-бла. :)

решение3

Довольно простое решение (и стандартная философская и лингвистическая уловка) заключается в различенииС использованиемсловокоманда, иУпоминаниесловокоманда. Например, некоторые слова выполняют действия, даже в обычном английском, и их использование — это то, как они это делают. Если вы скажете «I do» при соответствующих обстоятельствах, вы можете, например, жениться. Но не тогда, когда вы цитируете то, что мог бы сказать кто-то другой. Все, что цитируется, является упоминанием, а не использованием.

Итак, первый список команд — это не примеры использования команд, а лишь упоминания команд.

Вторые примеры, как мой любимый

  • $ rev wordlist | sort | rev > speculum
    (что создает копию в обратном алфавитном порядке wordlist)

действительно что-то сделают, так что они определенно Используют.

решение4

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

Во всех контекстах, которые я видел, когда слово «команда» относится к исполняемой программе, это всегда что-то, что конечный пользователь должен ввести в оболочку, чтобы запустить ее. Я никогда не видел выражений вроде «командаinit" или "командаld-linux.so".

Когда «команда» относится к программе командной строки, она всегда фактически относится к «семейству команд, которое начинается с указанной программы». Например, когда вы говорите «командаgrep", вы говорите обо всех вещах, которые вы можете сделать с grepпрограммой, которая образует "семейство команд". Это справедливо и для частичных команд, как и высказывание "команда apt installпредназначена для установки пакетов" когда полная команда apt installобычно не делает ничего полезного.

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