Linux を初めて使用しており、コマンド ライン引数についていくつか質問があります。
widget
という引数を取る というコマンドライン ツールがあるとしますfizz
。私は、さまざまなタイプの引数を見てきました。
widget -fizz
widget --fizz
widget \fizz
widget -f
これらの使用方法の違いは何ですか? コマンドライン ツールがそれらを異なる方法で決定するのでしょうか、それとも Linux はそれらがすべて同じ意味であることを認識しているが、アプリケーションに異なる方法で渡すのでしょうか?
(既存の)widget
ツールに引数を渡す独自の方法をカスタマイズできますかfizz
:
widget #f#
前もって感謝します!
答え1
これらの使用方法の違いは何ですか?
それは完全にプログラム次第です。なぜなら...
コマンドライン ツールは、それらを異なる方法で判別する方法を決定するのでしょうか、それとも、Linux は、それらがすべて同じ意味であることを認識しているが、アプリケーションに異なる方法で渡すのでしょうか?
...プロセスへの引数は、個々の文字列の配列として渡されます。
ここでは 2 つのことが関係しています。1 つはシェルで、入力内容を解析してプロセスを実行します。たとえば、シェルは文字列を空白で分割し、それを に渡します。これらの処理方法の詳細についてはwidget
、たとえば と を参照してくださいman sh
。man bash
しかし、最終的には、widget
引数を-fizz
、または--fizz
それが記述されているとおりに文字列として取得し、それをどう処理するかを決定します。
いくつかの標準があります。 および の多くのバリエーションがありgetopts
、popt
これらは の引数を処理しwidget
、ある程度の「標準」動作を備えています。
ただし、著者がwidget
独自の標準を発明することを妨げるものは何もありません。
したがって、最後に、ソース コードの作成者widget
またはソース コードを変更する場合は、それを引数#f#
として扱うことができますfizz
。ただし、プログラムを変更せずにこれを行うことはできません。
答え2
コマンドライン ツールは、それらを異なる方法で判別する方法を決定するのでしょうか、それとも、Linux は、それらがすべて同じ意味であることを認識しているが、アプリケーションに異なる方法で渡すのでしょうか?
引数を評価するのは実行可能ファイルまたは関数の役割です。シェル (Linux ではなく、、bash
などcsh
) はこれらの引数にまったく干渉しません。
これは、すべての引数があなたの場合、異なる方法で扱われることを意味します。ただし、シェルは拡張または代替品コマンドが引数を取得する前に、次のように記述します。たとえば、2 つの JPG 画像を含むフォルダーがある場合、次のように記述します。
ls *.jpg
すると、シェル*.jpg
は に展開されimage1.jpg image2.jpg
、ls
次の引数が渡されることになります。
ls image1.jpg image2.jpg
それ以外では、ソース コードを書き直す以外に、既にコンパイルされているか実行ファイルに書き込まれている引数以外の引数を取るようにスクリプトを変更することはできません。
次の質問も確認してください。
答え3
まず、Linux では で始まる引数を目にすることはほとんどありません。これは、ほとんどのシェルではこれがエスケープ文字であり、スペースやシェルにとって意味のあるその他の文字 ( 、、など)\
をエスケープするために使用されるためです。$
""
()
Linux シェル (ほとんどのディストリビューションでは Bash) は、スペースで区切られた各引数を文字列としてプロセスに渡すだけです。プロセスがそれらをどう処理するかは、プログラマの選択です。
通常、-
プレフィックスは短いオプション( など-h
)を示し、 は--
長いバージョン( など--help
)を示します。これは、ほとんどのLinuxプログラムが使用するPOSIX標準の一部であり、初期のUnixツールから継承されました。取得詳細についてはWikipediaの記事をご覧ください。
widget
最後の質問ですが、いいえ、ソース コードを変更しない限り、ツールがこれらの引数を解釈する方法を変更することはできません。
一部のUnixシステムには、パルグプロセスに渡されたすべての引数を確認できる。Linuxでは、これを次のように再現できる。
ps eww -p 12345
ここで、12345はプロセス識別子(PID)です。この答え代替案として。