терминология командной строки: как называются эти части команды?

21

В командной строке я часто использую «простые» команды, такие как

mv foo/bar baz/bar

но я не знаю, как назвать все части этого:

┌1┐ ┌──2───┐
git checkout master
│   └──────3──────┘
└───────4─────────┘

Я (кажется, я) знаю, что 1 - это команда, а 2 - аргумент, и я бы, вероятно, назвал 3 списком аргументов (это правильно?).

Тем не менее, я не знаю, как позвонить 4 .

Как помечаются более сложные «команды»?

find transcripts/?.? -name '*.txt' | parallel -- sh -c 'echo $1 $2' {} {/}

Я был бы признателен за ответ, который ломает то, что называть 1,2,3,4 и как называть каждую часть, например, этой «команды» выше.

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

theonlygusti
источник
1
Вы смотрели на manстраницах gitи find, в частности, в разделе синопсис?
fpmurphy
4
Вы смотрели на человека страниц для мерзавца и найти Так что этот вопрос не кажется , ничего общего с gitили findскорее общую терминологию для Linux.
Att Righ
Согласно странице человека Баша в A | B, A | Bявляется трубопроводом , Aи Bявляются командами (это прискорбно , что это имеет такое же имя , как только первый мир в команде). Я мог бы назвать первый аргумент исполняемым, но не могу найти источник, который согласен со мной.
Att Righ
4
В контексте git checkout ..., checkoutявляется подкомандой , а в контексте sh -c ..., -cявляется опцией .
wjandrea
@JoL спасибо за указание на это. Вы правильно догадались, я редактировал это. Это потому, что я переписал этот раздел примерно 4 раза, пытаясь сделать это правильно
theonlygusti

Ответы:

33

Общие названия для каждой части следующие:

┌1┐ ┌──2───┐
git checkout master
│   └──────3──────┘
└───────4─────────┘
  1. Имя команды (первое слово или токен командной строки, который не является перенаправлением или назначением переменной и после расширения псевдонимов).

  2. Токен, слово или аргумент команды. От человека Баш:

    слово: последовательность символов, рассматриваемая оболочкой как единое целое. Также известен как токен.

  3. Вообще: Аргументы

  4. Командная строка.

Объединение двух простых команд с a |представляет собой последовательность каналов или конвейер:

┌─1┐ ┌──────2──────┐ ┌─2─┐ ┌──2──┐   ┌──1───┐ ┌2┐┌2┐┌2┐┌────2─────┐ ┌2┐ ┌2┐
find transcripts/?.? -name '*.txt' | parallel -- sh -c 'echo $1 $2'  {} {/}
│    └────────────3──────────────┘            └────────────3──────────────┘
└───────────────────────────────────4─────────────────────────────────────┘

Помните, что есть перенаправление и присвоение переменных:

┌──5──┐ ┌1┐ ┌─2─┐ ┌─2─┐   ┌───6──┐ ┌1┐ ┌─5─┐
<infile tee file1 file2 | LC_ALL=C cat >file
└─────────7───────────┘   └───────7────────┘
└─────────────────────4────────────────────┘

Где (кроме чисел сверху):

  1. Перенаправление.
  2. Переменная присваивания.
  3. Простая команда.

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

Исаак
источник
2
В терминологии POSIX то, что вы называете конвейером, представляет собой последовательность конвейера или конвейер (хотя конвейер может иметь необязательный параметр, приводящий !к отрицанию его статуса). pipe скорее будет ссылаться на механизм IPC, используемый большинством оболочек для реализации конвейеров (конвейеры не должны использовать трубы, например, ksh93 использует пары сокетов в некоторых системах). Некоторые оболочки имеют больше ключевых слов, например time, noglobкоторые можно использовать вместо или в дополнение к этому !.
Стефан Шазелас
1
ИМХО, эти вещи называются аргументами - больше ничего, поэтому я думаю, что слово токен в этом контексте означает «атомная единица грамматики bash». Здесь термин токен существует только в контексте командной строки оболочки , а не в контексте выполнения программы. Было бы немного странно говорить «это токены программ», но, возможно, менее странно было бы говорить «второй токен в командной строке - $ test». Различение возникает cat $fileздесь, я бы сказал $file, это токен, но значение файла является аргументом.
Att Righ
1
@PeterCordes Вы правы, <<< «…» - это перенаправление, а не аргумент. Хотя это все еще символ линии. Извините за путаницу.
Исаак
1
@TOOGAM Они точно противоположны стандартным определениям. Вещи, предоставляемые вызывающей стороной, являются аргументами; ср «Формальный параметр», или это так вопрос .
Майкл Гомер
1
@TOOGAM "То, что я вижу, это параметры" . Хм, я думаю, что вы правы. В соответствии со спецификацией POSIX: «Оболочка выполняет функцию (см. Команда определения функции), встроенную (см. Специальные встроенные утилиты), исполняемый файл или скрипт, предоставляя имена аргументов в качестве позиционных параметров, пронумерованных от 1 до n, и имя команды (или в случае функции в сценарии, имя сценария) в качестве позиционного параметра с номером 0 (см. Поиск и выполнение команд). " и я был неправ все эти годы ... Хотя в мою защиту это называетсяargv
Att Righ
15

Ответ @ Исаака выше кажется хорошим.

Я хочу расширить это с некоторыми источниками.

Я предполагаю, что стандарт POSIX можно в некотором смысле считать каноническим . Другие источники могут быть man bashи man proc.

┌1┐ ┌──2───┐
git checkout master
│   └──────3──────┘
└───────4─────────┘

POSIX предполагает, что:

  1. Является ли имя команды (а не по команде, хотя даже в этом документе используется команда в местах)
  2. аргументация
  3. аргументы
  4. Команда (хотя man procиспользует командную строку )

Он также имеет терминологию для многих более сложных команд.

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

Att Righ
источник
Что за процесс? Я никогда не слышал об этом.
theonlygusti
5
+1 Мне больше нравится этот ответ. (В этом конкретном контексте 2 является подкомандой , но обычно да, аргумент).
kubanczyk
@theonlygusti proc- это файловая система специального назначения (коллекция файлов), которая предоставляет информацию о внутреннем состоянии ядра. Я считаю, что это означает процессы (см. Также sysfs, который предоставляет информацию о вещах, отличных от процессов). Причина, по которой это важно, написана разработчиками ядра , поэтому вполне может отразить используемый ими язык, который может быть немного более формальным.
Att Righ