Как создать команду с аргументами и файлом конфигурации? [closed]

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

pcap -d 30 -w 2

Другими словами:

I хотите создать команду, которая выглядела бы точно так же, как команды Linux. Команда, которая работает точно так же, как команды Linux. Команда, имеющая параметры (например, аргументы) в том же стиле, что и команды Linux.

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

Команда с параметром --help, показывающая различные параметры.

Я знаю, как создавать команды в Linux. Но я не знаю, как сделать эти параметры (аргументы команды). Я не знаю, как запрограммированы эти аргументы.

подойдет руководство, учебное пособие или пример

Примечание :

  1. Приносим извинения, если этот вопрос задан не в той стопке.
  2. Также приносим свои извинения за предыдущую версию вопроса, она была неправильно сформулирована.
1
задан 3 June 2016 в 07:34

3 ответа

Файл сценария:

#!/bin/bash

# set default values
X=10
Y="lorem ipsum"

source ~/.myscript.conf

echo "X = $X, Y = $Y"

.myscript.conf файл:

X=20
Y="something else"

Теперь, если пользователь выполняет файл сценария и не имеет .myscript.conf файла в его корневом каталоге, сценарий будет использовать X=10 и Y = "lorem ipsum", если будет файл конфигурации, то он будет использовать значения из файла.

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

, Так как ~ указывает на пользовательский корневой каталог, эта установка будет работать на любого пользователя в Вашей системе (также корень).

[Редактирование] И в Вашем определенном примере:

#!/bin/bash
X=10
Y=2
source ~/.config.conf
pcap -d $X -w $Y
2
ответ дан 3 June 2016 в 07:34

Bash: то же как Marek с определением источника файла со значениями пользователя, с протестом, что этот файл может сделать что-либо и опечатки, просто выявит синтаксические ошибки, таким образом, это потребует небольшого количества пользовательского ноу-хау. Можно проанализировать параметры командной строки с getopts.

Python : посмотрите argparse модуль для парсинга параметров командной строки и ConfigParser (v2) и configparser (v3) для парсинга .ini файла.

Обычно Вы используете файл конфигурации для вещей, которые часто не изменяются, и параметры командной строки для вещей, которые, вероятно, отличаются на каждом выполнении. Редактированием файла конфигурации на каждом выполнении является ЛАВАШ.

1
ответ дан 3 June 2016 в 07:34

Так как Вы упоминаете python, ответ Python:

если Вы просто хотите установить значение по умолчанию для аргумента, можно просто установить значение по умолчанию для функции:

def show(val = 30):
    print(val)
# to print the default value (30)
show()
# to show another value (e.g. 40)
show(40)

Другими словами, это распечатает значение по умолчанию, если Вы не дадите аргумента, в то время как оно использует аргумент при предоставлении его.

Более усовершенствованный; чтение значений по умолчанию из файла, с опцией взять верх путем предоставления аргументов

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

Скажем, у меня есть файл настроек, testconf.txt:

length:4
height:7
width:6

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

#!/usr/bin/env python3
import sys

# path to my config file
conf_file = "/home/jacob/Bureaublad/testconf.txt"
# read the default arguments from a file
def_args = [l.strip() for l in open(conf_file).readlines()]
# replace default args by possible custom args
cust_args = sys.argv[1:]
for cu in cust_args:
    argname = cu.split(":")[0]
    try:
        match = [arg for arg in def_args if arg.startswith(argname)][0]
    except IndexError:
        print("incorrect argument: ", cu)
    else:
        def_args[def_args.index(match)] = cu

def get_arg(s):
    return [val.split(":")[1] for val in def_args if val.startswith(s)][0]

l = get_arg("length")
w = get_arg("width")
h = get_arg("height")

print("l=", l, "w=", w, "h=", h)

Теперь я могу запустить скрипт без аргументов:

$ '/home/jacob/Bureaublad/pscript_4.py'
l= 4 w= 6 h= 7

Или аргументы ширины:

$ '/home/jacob/Bureaublad/pscript_4.py' length:10 height:456
l= 10 w= 6 h= 456

Порядок данных аргументов находится в этой не важной установке. В случае неправильного аргумента:

$ '/home/jacob/Bureaublad/pscript_4.py' monkey
incorrect argument:  monkey
l= 4 w= 6 h= 7

Примечание:

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


Править

Из Ваших комментариев я понимаю, что двумя способами, вышеупомянутый ответ (еще) не, что Вы ищете:

  1. Требуется выполнить команду без пути к исполняемому файлу (сценарий) и его расширение, и
  2. Требуется иметь более "стандартный" формат опций.

Хотя [1] уже anwered в другом месте, я буду включать краткое объяснение здесь:

1. Выполните команду без пути и расширение

Можно выполнить исполняемые файлы и сценарии, не имея необходимость включать путь к сценарию путем создания этого исполняемым файлом (chmod +x <files>), и разместите их куда угодно в $PATH.

На Linux, расширение (.py) не играет роль вообще, таким образом, можно использовать сценарий без расширения так или иначе.

Быть конкретным:

  • создайте, если это еще не существует, каталог ~/bin
  • создайте и сохраните сценарий, точно, как упомянуто в исходном ответе, как showsize (никакой extenion) в ~/bin, и сделайте исполняемый файл сценария.

    После журнала/в, можно просто запустить скрипт командой:

    showsize
    

2. Измените формат опций

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

-l 23 -h 210 -w 321
  • Если Вы включаете в сценарий:

    args = sys.argv [1:]

    Результат для argsбудет список:

    ["-l", "23", "-h", "210", "-w", "321"]
    

    Теперь, что мы должны сделать для получения значения -h, просто ищут индекс -h, и выберите первый следующий объект в списке:

    height = args[args.index("-h")+1]
    print(height)
    
    > 210
    

    в сценарии:

    #!/usr/bin/env python3
    import sys
    
    # path to my config file
    conf_file = "/home/jacob/Bureaublad/testconf.txt"
    # read the default arguments from a file
    def_args = [l.strip().split(":") for l in open(conf_file).readlines()]
    # replace default args by possible custom args
    cust_args = sys.argv[1:]
    for carg in cust_args:
        if carg in ["-l", "-h", "-w"]:                        
            for d in def_args:
                d[1] = cust_args[cust_args.index(carg)+1] if d[0] == carg else d[1]
    
    def get_arg(s):
        # fetch values from the list
        return [val[1] for val in def_args if val[0] == s][0]
    
    l = get_arg("-l")
    w = get_arg("-w")
    h = get_arg("-h")
    
    print("length =", l, "\nwidth =", w, "\nheight =", h)
    

Как использовать

  1. Создайте свой файл настроек в формате:

    -l:4
    -h:7
    -w:6
    
  2. Скопируйте сценарий в пустой файл, svae это как showsize (никакое расширение) в ~/bin или где-либо еще в $PATH, и сделайте это исполняемым файлом.

  3. В главном разделе сценария, установленного путь в файл настроек:

    # path to my config file
    conf_file = "/home/jacob/Bureaublad/testconf.txt"
    

    Теперь выполните команду:

    $ showsize
    length = 4 
    width = 6 
    height = 7
    

    Или:

    $ showsize -l 300 -h 345 -w 751
    length = 300 
    width = 751 
    height = 345
    
3
ответ дан 3 June 2016 в 07:34

Другие вопросы по тегам:

Похожие вопросы: