ポイントに直接、コマンドの実行方法を制御するために、コマンドに引数を渡す柔軟性をユーザーに与えたいと思います:
pcap -d 30 -w 2
つまり:
Linuxコマンドとまったく同じように見えるコマンドを作成したい。 Linuxコマンドとまったく同じように機能するコマンド。 Linuxコマンドと同じスタイルのオプション(つまり、引数)を持つコマンド。
他のLinuxコマンドとまったく同じように、ユーザーから引数が提供されない場合に、ユーザーから引数を取得するか、デフォルトの引数(構成ファイルから読み取られる)を使用して機能するコマンドを作成します。
さまざまなオプションを表示する--helpを使用したコマンド。
Linuxでコマンドを作成する方法を知っています。しかし、これらのオプション(コマンド引数)の作成方法がわかりません。これらの引数がどのようにプログラムされているかわかりません。
ガイド、チュートリアル、または例が行います
注:
python
に言及しているので、python answer:
引数のデフォルト値を単に設定したい場合は、単にset関数のデフォルトを指定できます。
def show(val = 30):
print(val)
# to print the default value (30)
show()
# to show another value (e.g. 40)
show(40)
つまり、引数を指定しない場合はデフォルト値が出力されますが、引数ifを指定すると使用されます。
まったく同じことができますが、ファイルからデフォルト引数を読み取ります。これにより、コード自体で引数を編集する代わりに、設定ファイルに引数を設定する機会が与えられます。
設定ファイルtestconf.txt
があるとします:
length:4
height:7
width:6
...そしてこれらの値をdefault引数としてアプリケーションに読み込みたいのですが、ユーザーcanはカスタム引数によってそれらを無効にします:
#!/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
「実際の」ソフトウェアでは、設定ファイルが間違っているか欠落している場合に警告を追加することで、もちろんそれをより高度にすることができます(そしてする必要があります)。
あなたのコメントから、私は2つの方法で、上記の答えはあなたが探している(まだ)ものではないことを理解しています:
[1]
は既に別の場所で解決されていますが、ここに簡単な説明を含めます。
実行可能ファイルとスクリプトを実行できますwithoutスクリプトへのパスを含める必要がありますexecutable(chmod +x <files>
)、および $ PATH 。
Linuxでは、extension(.py
)はまったく役割を果たさないため、拡張子anywayなしでスクリプトを使用できます。
具体的に:
~/bin
ディレクトリを作成します元の回答で述べたとおり、~/bin
のshowsize
(拡張子なし)、およびスクリプトを実行可能にするとして、スクリプトを作成して保存します。
ログアウト/ログイン後、次のコマンドでスクリプトを簡単に実行できます。
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
スクリプトを空のファイルにコピーし、~/bin
のshowsize
(拡張子なし)または$PATH
の任意の場所に保存し、実行可能にする]。
スクリプトのheadセクションで、設定ファイルへのパスを設定します。
# 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
スクリプトファイル:
#!/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"を使用し、構成ファイルがある場合、ファイルの値を使用します。
ソースコマンドは、現在のシェルで引数として指定されたファイルの内容を実行するため、ここでは、スクリプトファイルのデフォルトを上書きするXおよびYに新しい値を割り当てます。
〜はユーザーのホームディレクトリを指しているため、このセットアップはシステム上のすべてのユーザー(ルート)に対して機能します。
[編集]そしてあなたの特定の例では:
#!/bin/bash
X=10
Y=2
source ~/.config.conf
pcap -d $X -w $Y
Bash:ユーザーの値でファイルをソースするMarekと同じですが、このファイルは何でもできるという警告があり、タイプミスは構文エラーを誘発するだけなので、これにはユーザーのノウハウが少し必要です。 getoptsを使用してコマンドラインパラメーターを解析できます。
Python:コマンドラインパラメーターを解析するにはargparseモジュールを、.iniファイルを解析するにはConfigParser(v2)およびconfigparser(v3)を参照してください。
通常、頻繁に変更されないものには構成ファイルを使用し、実行ごとに異なる可能性が高いものにはコマンドラインパラメーターを使用します。実行ごとに構成ファイルを編集するのはPITAです。