web-dev-qa-db-ja.com

引数と構成ファイルを使用してコマンドを作成するにはどうすればよいですか?

ポイントに直接、コマンドの実行方法を制御するために、コマンドに引数を渡す柔軟性をユーザーに与えたいと思います:

pcap -d 30 -w 2

つまり:

Linuxコマンドとまったく同じように見えるコマンドを作成したい。 Linuxコマンドとまったく同じように機能するコマンド。 Linuxコマンドと同じスタイルのオプション(つまり、引数)を持つコマンド。

他のLinuxコマンドとまったく同じように、ユーザーから引数が提供されない場合に、ユーザーから引数を取得するか、デフォルトの引数(構成ファイルから読み取られる)を使用して機能するコマンドを作成します。

さまざまなオプションを表示する--helpを使用したコマンド。

Linuxでコマンドを作成する方法を知っています。しかし、これらのオプション(コマンド引数)の作成方法がわかりません。これらの引数がどのようにプログラムされているかわかりません。

ガイド、チュートリアル、または例が行います

  1. この質問が間違ったスタックで尋ねられた場合はおApび申し上げます。
  2. 質問の前のバージョンについてもおologiesび申し上げます。
1
McLan

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を指定すると使用されます。

より高度な; giving引数で上書きするオプションを使用して、ファイルからデフォルト値を読み取る

まったく同じことができますが、ファイルからデフォルト引数を読み取ります。これにより、コード自体で引数を編集する代わりに、設定ファイルに引数を設定する機会が与えられます。

設定ファイル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実行可能ファイル(スクリプト)へのパスとその拡張子、および
  2. より「従来の」形式のオプションが必要です。

[1]は既に別の場所で解決されていますが、ここに簡単な説明を含めます。

1.パスと拡張子なしでコマンドを実行します

実行可能ファイルとスクリプトを実行できますwithoutスクリプトへのパスを含める必要がありますexecutablechmod +x <files>)、および $ PATH

Linuxでは、extension.py)はまったく役割を果たさないため、拡張子anywayなしでスクリプトを使用できます。

具体的に:

  • まだ存在しない場合は、~/binディレクトリを作成します
  • 元の回答で述べたとおり、~/binshowsize(拡張子なし)、およびスクリプトを実行可能にするとして、スクリプトを作成して保存します。

    ログアウト/ログイン後、次のコマンドでスクリプトを簡単に実行できます。

    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. スクリプトを空のファイルにコピーし、~/binshowsize(拡張子なし)または$PATHの任意の場所に保存し、実行可能にする]

  3. スクリプトの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
    
3
Jacob Vlijm

スクリプトファイル:

#!/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
2
Marek Bettman

Bash:ユーザーの値でファイルをソースするMarekと同じですが、このファイルは何でもできるという警告があり、タイプミスは構文エラーを誘発するだけなので、これにはユーザーのノウハウが少し必要です。 getoptsを使用してコマンドラインパラメーターを解析できます。

Python:コマンドラインパラメーターを解析するにはargparseモジュールを、.iniファイルを解析するにはConfigParser(v2)およびconfigparser(v3)を参照してください。

通常、頻繁に変更されないものには構成ファイルを使用し、実行ごとに異なる可能性が高いものにはコマンドラインパラメーターを使用します。実行ごとに構成ファイルを編集するのはPITAです。

1
xenoid