Minishell-shellプログラムの作成

3060 ワード


bashを真似て小さなshellプロジェクトを作成する

입력값 : [echo helloworld! > test.txt]
토크나이저 결과 
[ "echo", "helloworld!", ">", "test.txt"]
렉서 결과 
[
	{type: 'command', value:"echo" },
	{type: 'string', value: "helloworld!"},
	{type: 'redirect', value: ">"},
    {type: 'file', value: "test.txt"}
]

Shellにコマンドを入力すると、その文字列をTokenに分割してLexer処理するLexical解析が行われます。



コマンドを入力すると、まず自分で作成したクローン関数を優先的に実行します。



クローン関数(bashシミュレーション関数)


クローン関数1:現在のディレクトリのcdを変更する




クローン関数2:echo(-nオプション実装)パラメータとして送信されたテキストを出力




クローン関数3:環境変数を表示するenv



クローン関数4:現在のプロセスを終了




クローン関数5:環境変数を追加するためにエクスポート



クローン関数6:unset、環境変数をクリア



クローン関数7:pwd現在のパスを表示




リダイレクト(<、<、>、>)

echo hello > a > b > c
result : a 빈파일, b 빈파일, c hello

次のパイプの前に、最後に宣言されたリダイレクトが最終目標になります。






クローン関数に実行するコマンドがない場合は、OS関数を実行します。


オペレーティングシステムPATHのファイルの実行



絶対パスを使用する場合は、システムcallstat関数を使用してファイルの存在を決定する方法でコマンドを実行します。「ls」のようにファイル名だけを書く場合は、PATHのパスを迂回して「ls」ファイルを検索して実行します。



実行時にプロセスを作成して実行します。正常に終了した可能性があるので、exitコードを受信する必要があります。親プロセスはwaitpid関数を使用してサブプロセスの終了を待機します。