
Словокомандаотносится к двум различным концепциям в Linux:
- Исполняемая программа, напримергрэп(или встроенная оболочка, напримерCD). Пример использования: «Вот 10 лучших команд Linux, которые вам следует изучить».
- Полная текстовая строка, отправляемая в оболочку для выполнения, напримерgrep com /etc/hosts. Пример использования: «Введите команду Linux и нажмите Enter».
Есть ли у кого-нибудь лучшие практики, чтобы избежать этой двусмысленности при написании прозы о командах Linux? Вот несколько попыток, которые я уже отклонил:
- Используя словопрограммаилиисполняемыйдля значения № 1. Это неточно для встроенных функций оболочки.
- Используя фразукомандная строкадля значения № 2. Это сбивает с толку, потому что «командная строка» также является синонимом «оболочки».
- Используя фразукомандная строкадля значения № 2. Это неточно, потому что и № 1, и № 2 являются строками.
Буду признателен за любые советы.
решение1
POSIXотносится к вещам, которые похожи grep
и cd
как "коммунальные услуги", ирезервы "команда"для инструкций. При последовательном использовании эти термины недвусмысленны.
Для рассмотрения ваших дел по очереди
«Исполняемая программа, например grep (или встроенная в оболочку программа, например cd)»этополезность:
ПолезностьПрограмма, за исключениемспециальные встроенные утилитыпредоставляется как часть языка команд оболочки, который может быть вызван по имени из оболочки для выполнения определенной задачи или связанного набора задач.
Которыйдалее уточнено с:
Система может реализовывать определенные утилиты как функции оболочки или встроенные утилиты.
если быть точным, это включает в себя обычные утилиты,
true
которые обычно встречаются как встроенные в оболочку.Формально, "специальные встроенные утилиты" отделены от утилит, которые не указаны далее; это такие вещи, как
break
,.
,eval
,set
, иtrap
, которые влияют на внутреннее состояние оболочки, но онинеincludecd
, который является обычным встроенным. За исключением нюансов спецификации (определенное поведение назначения переменных отличается и недоступно сexecvp
), "utility" достаточно, чтобы охватить обе категории на уровне пользователя. Статьи синтаксиса оболочки, такие какif
иwhile
не являются утилитами вообще."Полная текстовая строка, отправляемая в оболочку для выполнения, например
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
обычно не делает ничего полезного.