PalmNeko / minishell

pair project for minishell
MIT License
0 stars 0 forks source link

bashとminishellの機能比較 #21

Closed nytsdayo closed 1 week ago

nytsdayo commented 2 weeks ago

【やること】 minishellの課題要件において、bashの機能で不要なものの削除

【目的】 「bashであるこの機能、minishellの要件じゃないよね」を議論する場所 つつにゃん -> bashの機能そのものに対する理解を深める。(bashで何が出来るか、について浅い状態なので)

【方法】 bashのソースコードを解読し、minishell用に抜粋

「この機能はどうなんだ?」という疑問があれば調査開始前でも気軽にコメントしてください。

「機能」の粒度については割とあやふやですが、「manに書いてあり、ユーザーが意識して実行出来るもの」を想定しています。


(絶賛執筆中)

bashでやってminishellでやらないこと

minishellでやること

nytsdayo commented 2 weeks ago

TLPIよりシェルの説明要約(日本語版P.24-P.25)

シェルは、ユーザの入力したコマンドを読み取り、プログラムを実行する特殊なプログラムで、コマンドインタプリタとも言う。
ログインシェルはユーザが最初にログインした時にシェルを実行するために作成されたプロセスを指す。
コマンドインタプリタをカーネル内に組み込むOSもあるが、UNIXシステムではシェルはユーザプロセスです。
シェルはインタラクティブ用途以外にもシェルスクリプト(シェルコマンドを内容とするテキストファイル)を解釈、実行するように設計されており、プログラミング言語としての性格も有している。

シェルスクリプトの解釈はインタラクティブではなさそう?

PalmNeko commented 2 weeks ago

TLPIよりシェルの説明要約(日本語版P.24-P.25)

シェルは、ユーザの入力したコマンドを読み取り、プログラムを実行する特殊なプログラムで、コマンドインタプリタとも言う。
ログインシェルはユーザが最初にログインした時にシェルを実行するために作成されたプロセスを指す。
コマンドインタプリタをカーネル内に組み込むOSもあるが、UNIXシステムではシェルはユーザプロセスです。
シェルはインタラクティブ用途以外にもシェルスクリプト(シェルコマンドを内容とするテキストファイル)を解釈、実行するように設計されており、プログラミング言語としての性格も有している。

シェルスクリプトの解釈はインタラクティブではなさそう?

そうですね。シェルスクリプトの解釈はインタラクティブではないと思います。

nytsdayo commented 2 weeks ago

そうですね。シェルスクリプトの解釈はインタラクティブではないと思います。

ありがとうございます! 日曜日のMTGで echo 'echo test' | bash のような処理について、呼び出したbash側でシェルスクリプト的処理が必要である、とのことでしたが、この解釈だとここはインタラクティブじゃなさそう(要件外ぽい)

上記について認識が上手く出来ていなかったです🙇

PalmNeko commented 2 weeks ago

シェルスクリプトのように解釈しましたみたいな出力する必要はなさそうですか。

nytsdayo commented 2 weeks ago

シェルスクリプトのように解釈しましたみたいな出力する必要はなさそうですか。

「シェルスクリプトの解釈結果を出力する必要がなさそうですか?」って文脈で合ってますか? (いまいちイメージが出来ておらず🙇🙇)

現在

minishell > echo 'echo test' | ./minishell
minishell > echo 'echo test' | bash

のようなケースは考慮しなくて良い認識となってます。

返信明日になります

PalmNeko commented 2 weeks ago

シェルスクリプトのように解釈しましたみたいな出力する必要はなさそうですか。

「シェルスクリプトの解釈結果を出力する必要がなさそうですか?」って文脈で合ってますか? (いまいちイメージが出来ておらず🙇🙇)

現在

minishell > echo 'echo test' | ./minishell
minishell > echo 'echo test' | bash

のようなケースは考慮しなくて良い認識となってます。

返信明日になります

ややこしかったですね。「シェルスクリプトの解釈結果を必要はなさそうに感じる。」の意味で書きました。 本家では、

echo 'echo "sample' | bash

と書くと

bash: line 1: unexpected EOF while looking for matching `"'
bash: line 2: syntax error: unexpected end of file

のように表示されます。 ですが、minishellでは、次のように出力すればいいと思っています。

minishell: syntax error near unexpected token `sample'

「シェルスクリプトとして解釈するなら、行情報や追加のエラー文が必要ですが、今回はそれに対応しない。」というコトです。

ただ、パイプ的な使い方はできる必要があると思っています。

個人的に対応するべきだと思っている範囲について

よくないと思う例

以下のプログラムでは、パイプ時に>が表示されてしまう。

#include <readline/readline.h>
#include <stdlib.h>

int main(void)
{
        char *line;

        line = readline("> ");
        if (line == NULL)
                return (1);
        printf("%s\n", line);
        free(line);
        return (0);
}

結果

$ echo weoifjs | ./a.out
> weoifjs
weoifjs

パイプに対応した例

パイプでの処理には対応する必要がある。 しかし、シェルスクリプトのように解釈(行番号管理など)は不要だという認識です。 改善した後 

#include <readline/readline.h>
#include <stdlib.h>
#include <unistd.h>

int main(void)
{
        char *line;
        char *prompt;

        if (isatty(0) && isatty(1))
                prompt = "> "; // 実際にはPS1
        else
                prompt = "";
        line = readline(prompt);
        if (line == NULL)
                return (1);
        printf("%s\n", line);
        free(line);
        return (0);
}

出力結果

$ ./a.out
> abc
abc
$ echo test | ./a.out
test
test

パイプの時とインタラクティブな時で結果が違う。

nytsdayo commented 2 weeks ago

あーーー!!なるほど パイプ処理は標準出力を次のプロセスの標準入力に接続するから、TTYがターミナルじゃないだけでパイプライン処理の範疇なんですね

bash: line 1: unexpected EOF while looking for matching "' bash: line 2: syntax error: unexpected end of file のように表示されます。 ですが、minishellでは、次のように出力すればいいと思っています。 minishell: syntax error near unexpected tokensample'

shell script要素は省きつつ構文エラーを出すかどうか?ということだったんですね、その認識で問題ないです!