私が次のようなことをするとき:
./foo -uxw --bar something
シェルはこれらのコマンドを自動的に解析しますか、それとも各プログラムがそれ自体を解析する必要がありますか?
各プログラムはその引数を解析します。おそらくそれを調べてgetopt
、答えが次のようになるようにする必要があります。各プログラムは通常、引数の解析に依存しgetopt
ています。
いいえ、シェルはそれを解析しません。各プログラムはそれを独自に解析する必要があります。次のコードは、何が起こっているのかを明確にする必要があります。
#include <stdio.h>
int main(int argc, char **argv)
{
int i;
printf("argc: %d\n", argc);
for (i = 0; i < argc; i++) {
printf("argv[%d] = %s\n", i, argv[i]);
}
return 0;
}
このプログラムをコンパイルしましょう。
susam@nifty:~$ gcc args.c -o args
これを実行して、出力を確認しましょう。
.susam@nifty:~$ ./args
argc: 1
argv[0] = ./args
susam@nifty:~$ ./args foo bar
argc: 3
argv[0] = ./args
argv[1] = foo
argv[2] = bar
susam@nifty:~$ ./args -a foo --b bar
argc: 5
argv[0] = ./args
argv[1] = -a
argv[2] = foo
argv[3] = --b
argv[4] = bar
シェルが行う唯一のことは、コマンドラインで指定した各引数をプログラムに渡すことです。foo bar
プログラムには2つの別個の引数として渡されますが、プログラムには1つの引数として"foo bar"
または'foo bar
'が渡されます。はい。そのため、シェルは引数をプログラムに渡す前に、ある種の引数の解析を行います。引用符で囲まれた文字列を単一の引数と見なします。これがデモンストレーションです:
susam@nifty:~$ ./args -a foo bar
argc: 4
argv[0] = ./args
argv[1] = -a
argv[2] = foo
argv[3] = bar
susam@nifty:~$ ./args -a "foo bar"
argc: 3
argv[0] = ./args
argv[1] = -a
argv[2] = foo bar
susam@nifty:~$ ./args -a 'foo bar'
argc: 3
argv[0] = ./args
argv[1] = -a
argv[2] = foo bar
susam@nifty:~$ ./args -a "foo bar" 'car tar war'
argc: 4
argv[0] = ./args
argv[1] = -a
argv[2] = foo bar
argv[3] = car tar war
各プログラムは、すべての引数自体を解析する必要があります。それらの前にダッシュを付けるのは、Unixの慣例です。
いいえ、シェルはこれらのオプションを解析しません。各プログラムはそれを独自に解析する必要があります。
シェルはコマンドラインを空白で分割するため、プログラムは引数のリストを受け取ります。しかし、それらが何を意味するかを決めるのはプログラム次第です。多くの場合、のような引数解析ライブラリgetopt
が役立ちます。
プログラムの引数はシェルの問題ではありません。
(簡略化された)コマンドライン構文は次のとおりです。コマンドオプションオペランド。
オプションはハイフン(ダッシュ)で始まり、オペランドはそうではありません。オプションは順序付けられていません。オペランドは順序付けられています。
ただし、これは単なる慣例であり、法律ではありません。このための最もよく知られている標準は、一般にPOSIX標準と呼ばれ、ここでコマンドラインを定義します。
オプションは単一のハイフンが前に付いた単一の文字であることに気付くかもしれません。あなたの例は複数の文字を持つ2つのハイフンを示しています--bar
。これらはロングオプションとして知られており、厳密には標準の一部ではありませんが、GNUユーティリティプログラムで一般的に使用されています(Linuxの通常の場合)。
オペランドがハイフンで始まる場合はどうなりますか?答えは、ほとんどのプログラムがそれをオペランドと見なすということです。ただし、特別なマーカーがあります。--
(2つのハイフン)オプションリストの終わりを示すため、その後に続くものはすべてオペランドにすぎません。