シェルを実行できるようにしたい
cat file.txt
としても
ls -l
2番目の引数では常にテキストファイルになるため、これを行う方法がわかりませんが、2番目の引数cat
などls
のコマンドではそうではないため、別の方法で実行する必要があります。両方のケースを適切に処理する方法がわかりません。
シェルを実行できるようにしたい
cat file.txt
としても
ls -l
2番目の引数では常にテキストファイルになるため、これを行う方法がわかりませんが、2番目の引数cat
などls
のコマンドではそうではないため、別の方法で実行する必要があります。両方のケースを適切に処理する方法がわかりません。
シェルは、最初のパラメーターに一致するバイナリを探し、後続のすべてのパラメーターを文字列として最初のプログラムに渡す必要があります。シェルは、パラメーターの意味を決定する責任はありません。シェルが実行するプログラムです。
シェルは fork() を呼び出す必要があります。次に、子プロセス (fork() の戻り値 == 0) で、さまざまな exec コマンドの 1 つを呼び出して、ユーザー指定のプログラムを実行します。その間、元のプロセスは fork された子が waitpid() で完了するのを待っています。
http://linux.die.net/man/3/exec
それらの多くは、文字ポインターの配列をパラメーターとして受け取ることがわかります。後続のパラメーターを exec されたバイナリに渡して、それ自体を読み込んで解析できるようにします。
これを行う最善の方法の 1 つは、1 つ以上の区切り文字 (スペース、タブなど) に基づいて文字列を切り取り、結果の単語で配列を埋めることです。各単語を文字列の配列 ( "cat file.twt"
=> "cat", "file.txt"
) に配置したら、exec* 関数 (例: execve) を呼び出すことができます。
実行のために、何をする必要があるかに応じて、次のものが必要になる場合があります。
そして最後に、シェルを作成しているので、各バイナリが引数として期待するものを気にする必要はありません。これはシェルの仕事ではないためです (少なくともこの時点では)。