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

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

Я новичок в Linux и у меня есть несколько вопросов об аргументах командной строки:

Допустим, есть инструмент командной строки, который называется , widgetкоторый принимает аргумент, называемый fizz. Я видел все различные типы аргументов:

widget -fizz
widget --fizz
widget \fizz
widget -f

В чем разница в том, как они используются? Инструмент командной строки решает, как их определить по-разному, или Linux знает, что все они означают одно и то же, но передает их приложению по-разному?

Могу ли я настроить свой собственный способ передачи (уже существующему) widgetинструменту его fizzаргумента:

widget #f#

Заранее спасибо!

решение1

В чем разница в том, как они используются?

Это полностью зависит от программы, потому что...

Определяет ли инструмент командной строки их по-разному, или Linux знает, что все они означают одно и то же, но передает их приложению по-разному?

...аргументы процесса поступают в виде массива отдельных строк.

Здесь задействованы две вещи: одна из них — оболочка, которая анализирует вводимые вами данные и выполняет процесс. Она, например, разбивает строку на пробелы и передает их в widget. См., например, man shи man bashдля получения подробной информации о том, как они обрабатывают эти вещи.

В конечном итоге, однако, widgetполучает аргумент -fizzили --fizzименно так, как он записан, как строку. Он решает, что с ним делать.

Существуют некоторые стандарты — множество вариантов getoptsи popt, которые обрабатывают эти аргументы для widget, и у них есть некоторая степень «стандартного» поведения.

Однако ничто не мешает автору widgetизобрести свой собственный стандарт.

Итак, наконец, если вы являетесь автором widgetили каким-либо образом модифицируете исходный код, вы можете заставить его рассматриваться #f#как fizzаргумент. Однако вы не можете сделать это, не изменив программу.

решение2

Определяет ли инструмент командной строки их по-разному, или Linux знает, что все они означают одно и то же, но передает их приложению по-разному?

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

Это означает, что каждый аргумент обрабатывается по-разному в вашем случае. Однако обратите внимание, что оболочка выполняетрасширенияилизаменыдо того, как команда получит свои аргументы. Когда у вас, например, есть папка с двумя изображениями JPG, и вы пишете:

ls *.jpg

Затем оболочка расширится *.jpgдо image1.jpg image2.jpg, в результате чего lsбудут переданы следующие аргументы:

ls image1.jpg image2.jpg

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

Также ознакомьтесь со следующим вопросом:

В чем разница между одним и двумя дефисами для параметров командной строки?

решение3

Прежде всего, вы вряд ли увидите аргумент, начинающийся с , \в Linux, поскольку в большинстве оболочек это экранирующий символ, используемый для экранирования пробелов и других символов, имеющих значение для оболочки ( $, "", (), и т. д.).

Оболочка Linux (Bash в большинстве дистрибутивов) просто передает каждый разделенный пробелами аргумент в виде строк в процесс. Что процесс решит с ними сделать — это выбор программиста.

Обычно -префикс указывает на короткую опцию (например, -h), а --указывает на длинную версию (например, --help). Это часть стандарта POSIX, который используют большинство программ Linux, и который был унаследован от ранних инструментов Unix. См.getoptБолее подробную информацию можно найти в статье Википедии.

Что касается вашего последнего вопроса, нет, вы не можете изменить способ widgetинтерпретации этих аргументов инструментом, если только вы не измените его исходный код.

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

ps eww -p 12345

Где 12345 — идентификатор процесса (PID). См.этот ответдля альтернативы.

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