2

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

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

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

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

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

widget #f#

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

3 ответа3

2

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

Задача предполагаемого объекта или функции - оценить его аргументы. Оболочка (не Linux, а bash , csh и т.д.) Вообще не будет мешать этим аргументам.

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

ls *.jpg

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

ls image1.jpg image2.jpg

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

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

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

2

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

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

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

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

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

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

Есть несколько стандартов - множество вариантов getopts и popt которые обрабатывают эти аргументы для widget , и они имеют некоторую степень "стандартного" поведения.

Ничто не мешает автору widget придумывать собственный стандарт.

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

0

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

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

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

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

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

ps eww -p 12345

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .