Термінологія командного рядка: як називаються ці частини команди?


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 і як викликати кожну частину, наприклад, ця "команда" вище.

Було б чудово дізнатися і про інші речі, унікальні / дивні, що я сюди не включив.


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. Маркер, слово або аргумент команди. Від man bash:

    слово: Послідовність символів, що розглядаються оболонкою як одна одиниця. Також відомий як маркер.

  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 те, що ви називаєте трубою, - це послідовність трубопроводів або трубопровід (хоча трубопровід може мати необов'язковий характер, що призводить !до скасування його стану). Труба швидше посилається на механізм IPC, який використовується більшістю оболонок для впровадження трубопроводів (трубопроводи не повинні використовувати труби, ksh93 використовує socketpairs замість деяких систем, наприклад). Деякі оболонки мають кілька ключових слів , як time, noglobякі можуть бути використані замість або на додаток до !тут.
Стефан Шазелас

1
ІМХО, ці речі називаються аргументами - нічого іншого, тому я думаю, що слово маркер у цьому контексті означає "атомна одиниця граматики Баша". Тут термін маркер існує лише в контексті командного рядка оболонки , а не в контексті виконання програми. Було б трохи дивно сказати "це маркери програм", але, можливо, менш дивно сказати "другий жетон в командному рядку - $ test". Тут з'являється відмінність cat $file, я б сказав $file, що це маркер, але значення файлу є аргументом.
Att Righ

1
@PeterCordes Ви праві, <<< "..." - це перенаправлення, а не аргумент. Хоча це все-таки ознака лінії. Вибачте за непорозуміння.
Ісаак

1
@TOOGAM Це абсолютно протилежно стандартним визначенням. Те, що надає абонент, - це аргументи; пор. "Формальний параметр", або це питання SO .
Майкл Гомер

1
@TOOGAM "Що я бачу, це параметри" . Хм, я думаю, ти маєш рацію. Відповідно до специфікації POSIX: "Оболонка виконує функцію (див. Команду визначення функції), вбудовану (див. Спеціальні вбудовані утиліти), виконуваний файл або сценарій, надаючи назви аргументів як позиційні параметри, пронумеровані від 1 до n, і назва команди (або у випадку функції в межах сценарію, назва сценарію) як позиційний параметр, пронумерований 0 (див. Пошук і виконання команд). " і я помилявся всі ці роки ... Хоча на мій захист це називаєтьсяargv
Att Righ

15

Відповідь @ isaac вище здається гарною.

Я хочу поширити це на деякі джерела.

Я думаю, стандарт POSIX в певному сенсі може вважатися канонічним . Іншими джерелами можуть бути man bashі man proc.

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

POSIX пропонує:

  1. Це ім'я команди (а не команда, хоча навіть цей документ використовує команду місцями)
  2. Аргумент
  3. Аргументи
  4. Команда (хоча man procвикористовує командний рядок )

Він також має термінологію для багатьох більш складних команд.

Я думаю , що команда досить неоднозначна тому , можливо, термін ім'я команди і командний рядок хороша для clarity.j


Що прок? Я ніколи про це не чув.
theonlygusti


5
+1 Найкраще мені подобається ця відповідь. (У цьому конкретному контексті 2 є підкомандою , але, як правило, аргументом).
kubanczyk

@theonlygusti proc- це файлова система спеціального призначення (колекція файлів), яка забезпечує інформацію про внутрішній стан ядра. Я вважаю, що це розшифровується процес (див. Також sysfs, який надає інформацію про інші речі, ніж процеси). Причину, в якій це стосується, пишуть розробники ядра , тому цілком може відображати мову, якою вони користуються, яка може бути трохи більш формальною.
Att Righ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.