Closed nytsdayo closed 1 week ago
TLPIよりシェルの説明要約(日本語版P.24-P.25)
シェルは、ユーザの入力したコマンドを読み取り、プログラムを実行する特殊なプログラムで、コマンドインタプリタとも言う。
ログインシェルはユーザが最初にログインした時にシェルを実行するために作成されたプロセスを指す。
コマンドインタプリタをカーネル内に組み込むOSもあるが、UNIXシステムではシェルはユーザプロセスです。
シェルはインタラクティブ用途以外にもシェルスクリプト(シェルコマンドを内容とするテキストファイル)を解釈、実行するように設計されており、プログラミング言語としての性格も有している。
シェルスクリプトの解釈はインタラクティブではなさそう?
TLPIよりシェルの説明要約(日本語版P.24-P.25)
シェルは、ユーザの入力したコマンドを読み取り、プログラムを実行する特殊なプログラムで、コマンドインタプリタとも言う。 ログインシェルはユーザが最初にログインした時にシェルを実行するために作成されたプロセスを指す。 コマンドインタプリタをカーネル内に組み込むOSもあるが、UNIXシステムではシェルはユーザプロセスです。 シェルはインタラクティブ用途以外にもシェルスクリプト(シェルコマンドを内容とするテキストファイル)を解釈、実行するように設計されており、プログラミング言語としての性格も有している。
シェルスクリプトの解釈はインタラクティブではなさそう?
そうですね。シェルスクリプトの解釈はインタラクティブではないと思います。
そうですね。シェルスクリプトの解釈はインタラクティブではないと思います。
ありがとうございます!
日曜日のMTGで
echo 'echo test' | bash
のような処理について、呼び出したbash側でシェルスクリプト的処理が必要である、とのことでしたが、この解釈だとここはインタラクティブじゃなさそう(要件外ぽい)
上記について認識が上手く出来ていなかったです🙇
シェルスクリプトのように解釈しましたみたいな出力する必要はなさそうですか。
シェルスクリプトのように解釈しましたみたいな出力する必要はなさそうですか。
「シェルスクリプトの解釈結果を出力する必要がなさそうですか?」って文脈で合ってますか? (いまいちイメージが出来ておらず🙇🙇)
現在
minishell > echo 'echo test' | ./minishell
minishell > echo 'echo test' | bash
のようなケースは考慮しなくて良い認識となってます。
返信明日になります
シェルスクリプトのように解釈しましたみたいな出力する必要はなさそうですか。
「シェルスクリプトの解釈結果を出力する必要がなさそうですか?」って文脈で合ってますか? (いまいちイメージが出来ておらず🙇🙇)
現在
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
パイプの時とインタラクティブな時で結果が違う。
あーーー!!なるほど パイプ処理は標準出力を次のプロセスの標準入力に接続するから、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 token
sample'
shell script要素は省きつつ構文エラーを出すかどうか?ということだったんですね、その認識で問題ないです!
【やること】 minishellの課題要件において、bashの機能で不要なものの削除
【目的】 「bashであるこの機能、minishellの要件じゃないよね」を議論する場所 つつにゃん -> bashの機能そのものに対する理解を深める。(bashで何が出来るか、について浅い状態なので)
【方法】 bashのソースコードを解読し、minishell用に抜粋
「この機能はどうなんだ?」という疑問があれば調査開始前でも気軽にコメントしてください。
「機能」の粒度については割とあやふやですが、「manに書いてあり、ユーザーが意識して実行出来るもの」を想定しています。
(絶賛執筆中)
bashでやってminishellでやらないこと
minishellでやること
この場合の起動パターンのみ考慮すれば良い認識。