Skip to content

本番統合 (by urassh)#80

Merged
jiku0730 merged 194 commits into
mainfrom
prod-urassh
Apr 18, 2026
Merged

本番統合 (by urassh)#80
jiku0730 merged 194 commits into
mainfrom
prod-urassh

Conversation

@urassh
Copy link
Copy Markdown
Collaborator

@urassh urassh commented Apr 18, 2026

Summary

prod-urassh ブランチの全変更を develop にマージするPR。prodブランチからの変更に加え、feature/signal-exec、feature/subshell、fix/redirect の各ブランチを統合。

実行基盤 (prod)

  • コマンド実行: on_input を本番用に組み替え、fork による外部コマンド実行を実装
  • 外部コマンド: exec_cmd.c に外部コマンド実行を統合し重複 join_path を削除、exec_external_cmd を独立ファイルに分離
  • パス解決: find_exec_path を追加し、コマンドが見つからない場合のエラー処理 (126/127) を実装
  • 不要コード削除: テスト・デバッグコード (src/checker/, docs/, print_ast*) を削除

シグナルハンドリング (feature/signal-exec)

  • コマンド実行中のシグナル制御を実装(子プロセス: default、親: wait中 ignore → 完了後 interactive に復帰)
  • シグナルで終了したプロセスの終了コードを 128 + WTERMSIG で正しく返すように修正
  • heredoc 入力中の Ctrl+C でプロンプトに戻るよう修正

サブシェル (feature/subshell)

  • (cmd1 && cmd2) | cmd3 のようなサブシェルグループのパーサ・実行サポートを追加
  • SUBSHELL ASTノード型を追加、parse_pipeline を独立ファイルに移動
  • exec_subshell で fork し子プロセス内でサブシェルASTを実行

論理演算子 (feature/logical-operators)

  • && / || 論理演算子のパーサ・実行サポートを追加
  • $? 展開対応 (expand_question)、on_inputlast_status を管理

リダイレクト修正 (fix/redirect)

  • リダイレクトが親プロセスの fd を壊す問題を修正(ビルトインでの fd 保存/復元)
  • ビルトイン判定を実行前に is_builtin() で行い二重実行を防止
  • ビルトイン出力を printfft_putstr_fd/write に変更しバッファフラッシュ問題を根本解消

Expand 層

  • expand を executor に移動し、コマンド単位で展開するようリファクタ
  • クォート境界でトークンが分割される問題を修正
  • クォート削除でクォートの開閉状態を追跡するよう修正
  • 閉じられていないクォートのエラーメッセージを追加
  • パスなしワイルドカードがフルパスで展開される問題を修正

その他

  • export コマンドを bash 互換に改善
  • norminette 違反の修正
  • parse_cmdparse_token/is_cmd_end に分離して25行制限に対応

Test plan

基本コマンド実行

  • ls — 外部コマンドが正常に実行されること
  • ls -la /tmp — 引数付き外部コマンドが動作すること
  • /bin/ls — 絶対パスでコマンドが実行されること
  • ./minishell — 相対パスでコマンドが実行されること
  • notexistcommand not found (終了ステータス 127)
  • /nonexistent_file → パスあり存在しないコマンドでエラー (終了ステータス 127)
  • /tmp → ディレクトリを実行しようとして is a directory エラー (終了ステータス 126)

ビルトインコマンド

  • echo hello world — 引数を出力すること
  • echo -n hello — 改行なしで出力すること
  • echo -nnn hello — 複数 n フラグでも改行なしで出力すること
  • pwd — カレントディレクトリを出力すること
  • cd /tmp && pwd — ディレクトリ移動後のパスが正しいこと
  • export FOO=bar && echo $FOObar
  • export — bash 互換の declare -x 形式で出力されること
  • unset FOO && echo $FOO — 変数が削除されること
  • exit — シェルが正常に終了すること
  • exit 42 → 終了ステータスが 42 であること

パイプ

  • echo hello | cathello
  • echo hello | cat | cat — 3段パイプが動作すること
  • ls | grep minishell | wc -l — 複数段パイプの結果が正しいこと
  • cat /dev/urandom | head -c 100 | wc -c100

リダイレクト

  • echo hello > out.txt — ファイルに書き込まれること
  • echo hello > out.txt && cat out.txthello
  • echo hello >> out.txt && echo world >> out.txt — 追記リダイレクトが動作すること
  • cat < Makefile — 入力リダイレクトが動作すること
  • echo builtin > out.txt && cat out.txt — ビルトインのリダイレクトで正しくファイルに書き込まれること(バッファ問題の修正確認)
  • pwd > out.txt && cat out.txt — pwd のリダイレクトが正しく動作すること
  • cat < nonexistent — 存在しないファイルでエラーになること
  • リダイレクト後に通常の stdout 出力が壊れていないこと(fd 復元の確認)

ヒアドキュメント

  • cat << EOF → 入力を受け付けて EOF で終了すること
  • heredoc 入力中に Ctrl+C でプロンプトに戻ること (終了ステータス 130)
  • 複数の heredoc を含むコマンドが正しく動作すること

論理演算子

  • true && echo okok
  • false && echo ng → 何も出力されないこと
  • false || echo fallbackfallback
  • true || echo ng → 何も出力されないこと
  • true && true && echo okok (連鎖)
  • false || false || echo lastlast (連鎖)
  • true && false || echo recoveredrecovered (混合)
  • false || true && echo okok (混合)

サブシェル

  • (echo hello)hello
  • (echo hello && echo world)hello\nworld
  • (echo hello && echo world) | cat — サブシェルとパイプの組み合わせ
  • (false || echo ok)ok — サブシェル内の論理演算子
  • (cd /tmp && pwd)/tmp でサブシェル外の pwd は変わらないこと
  • (exit 42) → サブシェルのみ終了し親シェルは継続すること

終了ステータスと $?

  • echo $? — 直前の終了ステータスが表示されること
  • true && echo $?0
  • false の後 echo $?1
  • notexist の後 echo $?127
  • シグナルで終了したコマンドの $?128 + シグナル番号 であること (例: Ctrl+C → 130)

シグナルハンドリング

  • 対話モードで Ctrl+C → 新しいプロンプトが表示されること
  • cat 実行中に Ctrl+C → cat が終了しプロンプトに戻ること
  • cat | cat | ls 実行中に Ctrl+C → 正しく中断されること
  • sleep 100 実行中に Ctrl+C → 中断されること
  • 対話モードで Ctrl+\ → 何も起きないこと (SIGQUIT 無視)
  • コマンド実行中の Ctrl+\ → コアダンプで終了すること

クォート

  • echo "hello world"hello world (ダブルクォート)
  • echo 'hello world'hello world (シングルクォート)
  • echo "hello'world"hello'world (クォート境界)
  • echo 'hello"world'hello"world (クォート境界)
  • echo "hello""world"helloworld (連続クォート)
  • echo "$HOME" → 変数が展開されること (ダブルクォート内)
  • echo '$HOME'$HOME (シングルクォート内は展開されない)
  • 閉じられていないクォート → エラーメッセージが表示されること

変数展開

  • echo $HOME — 環境変数が展開されること
  • echo $NONEXISTENT → 空文字列になること
  • echo "$HOME" — ダブルクォート内で展開されること
  • echo '$HOME'$HOME (展開されない)

ワイルドカード

  • echo *.c — カレントディレクトリの .c ファイルが展開されること
  • echo src/*.c — パス付きワイルドカードが正しく展開されること
  • マッチしないパターン → パターン文字列がそのまま残ること

エッジケース

  • 空入力 → 何も起きずプロンプトが再表示されること
  • スペースのみの入力 → 何も起きずプロンプトが再表示されること
  • Ctrl+D (EOF) → exit と表示されてシェルが終了すること
  • 非常に長いコマンドライン → クラッシュしないこと

🤖 Generated with Claude Code

Jikuhara and others added 30 commits September 29, 2025 14:35
PR説明用のデフォルトコメントメッセージを設定しました。
libftを追加しました。
基本となるディレクトリを作成しました。
① minishellディレクトリから平坦化
PRのテンプレートに動作確認の項目を追加した
* feat: pushされるたびにnorminetteをチェックするCIを実装

* ciのチェックはpushのみ

* add: jiku/* ブランチの時もnorminette監視対象になるように

* fix: master
* feat: pushされるたびにnorminetteをチェックするCIを実装

* ciのチェックはpushのみ

* add: jiku/* ブランチの時もnorminette監視対象になるように

* add: buildできるかどうかのテストも追加

* fix: pushごとに

* fix: master
urassh and others added 14 commits April 16, 2026 22:20
* fix: on_inputの終了ステータス処理を整理

* fix: statusをon_input内部で変更できるように関数シグネチャを変更した。

* add: expand層に$?を展開するexpand_question層を追加。

* fix: includes/prompt.hのNormを修正。

* fix: on_inputのlast_statusのSignitureを、int *->intに変更。

* chore: 可読性を上げるために、current_statusという一時変数を追加。
- declare -x プレフィックス付きで一覧表示
- export FOO (値なし) と export FOO= (空文字) を区別
- 不正な識別子にエラーメッセージを表示

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
外部コマンドのリダイレクトは子プロセスのみで実行し、
ビルトインのリダイレクトは dup で fd を保存・復元するよう変更。
cmd_not_found と exec_external_cmd を find_exec_path.c に移動。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- parse_redir の戻り値判定を !result から == ERROR に修正
- ビルトイン実行後に fflush(stdout) を追加し fd 復元前にバッファを確実にフラッシュ

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
# Conflicts:
#	src/callback/on_input.c
on_input で展開済みのため exec_cmd 内の expand/expand_redir_filenames は不要。
expand_redirs.c も削除。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
シグナルハンドリング(子プロセスdefault/親ignore/復帰interactive)、
128+WTERMSIG終了コード、exec_external_cmd分離を取り込み。
prod-urassh側のis_builtin事前判定・fd保存復元・last_statusパラメータ方式を維持。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- echo/pwdのprintfをft_putstr_fd/writeに置換しリダイレクト時のバッファ問題を解消
- exec_subshellにシグナルハンドリング(default/ignore/interactive)を追加
- exec_builtin_with_redirから禁止関数fflushを削除

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@urassh urassh changed the title feat: シグナル制御・サブシェル・リダイレクト修正の統合 本番統合 (by urassh) Apr 18, 2026
parse_tokenとis_cmd_endを分離して25行制限に対応。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@urassh urassh self-assigned this Apr 18, 2026
urassh and others added 6 commits April 18, 2026 12:45
ディレクトリをコマンドとして実行した際に "Is a directory" エラー(終了ステータス126)を
正しく返すように修正。また、変数展開をパイプライン全体の一括処理からコマンド単位の
実行時展開に変更し、export FOO=bar && echo $FOO が正しく動作するようにした。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
exit_status=1との混合を避けるため。

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@urassh urassh changed the base branch from develop to main April 18, 2026 05:16
jiku0730
jiku0730 previously approved these changes Apr 18, 2026
Copy link
Copy Markdown
Owner

@jiku0730 jiku0730 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

Copy link
Copy Markdown
Owner

@jiku0730 jiku0730 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@jiku0730 jiku0730 merged commit 80965d2 into main Apr 18, 2026
@jiku0730 jiku0730 deleted the prod-urassh branch April 18, 2026 05:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants