Я новичок в 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). См.этот ответдля альтернативы.