Переходя к делу, я хочу дать пользователю возможность передавать аргументы команде, чтобы контролировать их выполнение, например:
pcap -d 30 -w 2
Другими словами:
I хотите создать команду, которая выглядела бы точно так же, как команды Linux. Команда, которая работает точно так же, как команды Linux. Команда, имеющая параметры (например, аргументы) в том же стиле, что и команды Linux.
Я хочу создать команду, которая работает, принимая аргументы от пользователя или используя свои аргументы по умолчанию (считанные из файла конфигурации) в случае, если пользователь не предоставляет аргументов, точно так же, как любые другие команды Linux.
Команда с параметром --help, показывающая различные параметры.
Я знаю, как создавать команды в Linux. Но я не знаю, как сделать эти параметры (аргументы команды). Я не знаю, как запрограммированы эти аргументы.
подойдет руководство, учебное пособие или пример
Примечание :
Файл сценария:
#!/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
Bash: то же как Marek с определением источника файла со значениями пользователя, с протестом, что этот файл может сделать что-либо и опечатки, просто выявит синтаксические ошибки, таким образом, это потребует небольшого количества пользовательского ноу-хау. Можно проанализировать параметры командной строки с getopts.
Python : посмотрите argparse модуль для парсинга параметров командной строки и ConfigParser (v2) и configparser (v3) для парсинга .ini файла.
Обычно Вы используете файл конфигурации для вещей, которые часто не изменяются, и параметры командной строки для вещей, которые, вероятно, отличаются на каждом выполнении. Редактированием файла конфигурации на каждом выполнении является ЛАВАШ.
Так как Вы упоминаете 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]
уже anwered в другом месте, я буду включать краткое объяснение здесь:
Можно выполнить исполняемые файлы и сценарии, не имея необходимость включать путь к сценарию путем создания этого исполняемым файлом (chmod +x <files>
), и разместите их куда угодно в $PATH.
На Linux, расширение (.py
) не играет роль вообще, таким образом, можно использовать сценарий без расширения так или иначе.
Быть конкретным:
~/bin
создайте и сохраните сценарий, точно, как упомянуто в исходном ответе, как showsize
(никакой extenion) в ~/bin
, и сделайте исполняемый файл сценария.
После журнала/в, можно просто запустить скрипт командой:
showsize
Как упомянуто, можно изменить формат опций легко, например: проанализировать опции, учитывая подобный:
-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)
Создайте свой файл настроек в формате:
-l:4
-h:7
-w:6
Скопируйте сценарий в пустой файл, svae это как showsize
(никакое расширение) в ~/bin
или где-либо еще в $PATH
, и сделайте это исполняемым файлом.
В главном разделе сценария, установленного путь в файл настроек:
# 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