[インデックス 11977] ファイルの概要
このコミットは、Go言語プロジェクトのWindowsバッチスクリプトである src/make.bat
と src/run.bat
における、改行出力の方法を修正するものです。具体的には、echo .
(echo の後にスペースとピリオド) を echo.
(echo の後にピリオドのみ) に変更することで、より確実に改行を出力するようにしています。
コミット
- コミットハッシュ:
7fc47928fc807a0c79c5649d7ee9e10d55f3c360
- 作者: Hector Chu hectorchu@gmail.com
- 日付: 2012年2月16日 木曜日 20:49:50 UTC
- コミットメッセージ:
make.bat, run.bat: echo newlines R=golang-dev, rsc CC=golang-dev https://golang.org/cl/5671072
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/7fc47928fc807a0c79c5649d7ee9e10d55f3c360
元コミット内容
make.bat, run.bat: echo newlines
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5671072
変更の背景
Windowsのコマンドプロンプト(バッチファイル)において、echo
コマンドは通常、引数なしで実行すると現在の ECHO
設定(ECHO is ON.
または ECHO is OFF.
)を表示します。しかし、単に改行を出力したい場合、慣習的に echo.
や echo/
といった形式が用いられます。
このコミット以前の make.bat
および run.bat
では、改行を出力するために echo .
(echo の後にスペースとピリオド) が使用されていました。この形式は、特定の環境やコマンドプロンプトのバージョンによっては、期待通りに改行を出力せず、代わりに .
(ピリオド) そのものを出力してしまう、あるいは ECHO
設定を表示してしまうといった、意図しない挙動を示す可能性がありました。
この変更は、Goプロジェクトのビルドおよびテストスクリプトが、Windows環境で常に期待通りに改行を出力し、スクリプトの出力が読みやすくなるようにするために行われました。特に、ビルドやテストの各ステップの区切りとして改行が使われていたため、その表示の安定性が求められました。
前提知識の解説
Windowsバッチファイルの echo
コマンド
echo
コマンドは、Windowsのコマンドプロンプト(cmd.exe
)で使用される内部コマンドで、主に以下の用途で使われます。
- 文字列の表示:
echo Hello World
のように、指定した文字列を標準出力に表示します。 - ECHO 設定の表示/変更:
echo
(引数なし): 現在のECHO
設定(ECHO is ON.
またはECHO is OFF.
)を表示します。echo on
: コマンドプロンプトでのコマンド表示を有効にします。echo off
: コマンドプロンプトでのコマンド表示を無効にします。バッチファイルの先頭に@echo off
と記述することで、スクリプト内のコマンド自体が表示されなくなり、出力がすっきりします。
- 改行の出力: これが今回のコミットの核心です。
echo.
:echo
の直後にピリオドを置くことで、確実に改行を出力する最も一般的な方法です。ピリオドは、echo
コマンドが「表示すべき文字列がある」と認識するための最小限の引数として機能し、その結果として改行が生成されます。echo/
: スラッシュを使用する方法も同様に改行を出力します。echo
(echo の後にスペースのみ): この形式は、echo
設定を表示してしまうため、改行目的では使用できません。echo .
(echo の後にスペースとピリオド): この形式は、echo
コマンドが「.
という文字列を表示する」と解釈する場合と、「改行を出力する」と解釈する場合があり、環境やコマンドプロンプトのバージョン、あるいはECHO
設定の状態によって挙動が不安定になることが知られています。特に、echo
がON
の状態では.
が表示され、echo
がOFF
の状態では改行のみが表示されるといった挙動の違いが見られることがあります。この不安定性が、今回の修正の動機となっています。
Go言語のビルドシステムにおけるバッチファイルの役割
Go言語の初期のビルドシステムでは、クロスプラットフォーム対応のため、Unix系のシェルスクリプト(make.bash
や run.bash
など)と、Windows向けのバッチスクリプト(make.bat
や run.bat
など)が並行して存在していました。これらのスクリプトは、Goコンパイラや標準ライブラリのビルド、テストの実行といった、プロジェクトの基本的な開発ワークフローを自動化するために使用されていました。
make.bat
は主にGoのツールチェイン(コンパイラ、リンカなど)や標準ライブラリのビルドを担当し、run.bat
はビルドされたGo環境を使って各種テストを実行する役割を担っていました。これらのスクリプトの出力は、ビルドやテストの進行状況を開発者に伝える上で重要であり、特に改行による区切りは、出力の可読性を高めるために不可欠でした。
技術的詳細
このコミットの技術的詳細は、Windowsバッチスクリプトにおける echo
コマンドの挙動の微妙な違いに集約されます。
従来の echo .
という記述は、echo
コマンドが「.
という文字列を表示する」と解釈される可能性がありました。これは、echo
の後に続くスペースが引数とコマンドを区切るものと見なされ、その後のピリオドが単なる文字列として扱われるためです。この場合、期待される改行ではなく、実際にピリオドが表示されてしまいます。
一方、echo.
という記述は、echo
コマンドが「引数なし」と解釈されることを防ぎつつ、かつ表示すべき具体的な文字列がない(ピリオドがコマンドの一部として解釈される)ため、結果として改行のみが出力されるという、より安定した挙動を示します。これは、echo
の直後に続く記号(ピリオドやスラッシュなど)が、echo
コマンドの特殊な引数として扱われるためです。
この修正は、GoプロジェクトのWindowsビルド環境において、ビルドログやテスト結果の出力が常に整形され、読みやすい状態を保つことを保証します。特に、自動化されたCI/CD環境などでは、スクリプトの出力が安定していることが重要であり、このような細かな修正が全体の信頼性向上に寄与します。
コアとなるコードの変更箇所
このコミットでは、src/make.bat
と src/run.bat
の2つのファイルが変更されています。変更内容は、echo .
を echo.
に置き換えることです。
src/make.bat
の変更
--- a/src/make.bat
+++ b/src/make.bat
@@ -38,8 +38,7 @@ if errorlevel 1 goto fail
if errorlevel 1 goto fail
call env.bat
del env.bat
-:: Echo with no arguments prints whether echo is turned on, so echo dot.
-echo .
+echo.
echo # Building compilers and Go bootstrap tool.
set buildall=-a
@@ -49,7 +48,7 @@ if errorlevel 1 goto fail
:: Delay move of dist tool to now, because bootstrap cleared tool directory.
move .\\cmd\\dist\\dist.exe %GOTOOLDIR%\\dist.exe
%GOTOOLDIR%\\go_bootstrap clean -i std
-echo .
+echo.
if not %GOHOSTARCH% == %GOARCH% goto localbuild
if not %GOHOSTOS% == %GOOS% goto localbuild
@@ -63,14 +62,14 @@ set GOARCH=%GOHOSTARCH%\
%GOTOOLDIR%\\go_bootstrap install -v std
endlocal
if errorlevel 1 goto fail
-echo .
+echo.
:mainbuild
echo # Building packages and commands.
%GOTOOLDIR%\\go_bootstrap install -a -v std
if errorlevel 1 goto fail
del %GOTOOLDIR%\\go_bootstrap.exe
-echo .
+echo.
if x%1==x--no-banner goto nobanner
%GOTOOLDIR%\\dist banner
src/run.bat
の変更
--- a/src/run.bat
+++ b/src/run.bat
@@ -18,23 +18,23 @@ if x%1==x--no-rebuild goto norebuild
echo # Building packages and commands.
go install -a -v std
if errorlevel 1 goto fail
-echo .
+echo.
:norebuild
echo # Testing packages.
go test std -short -timeout=120s
if errorlevel 1 goto fail
-echo .
+echo.
echo # runtime -cpu=1,2,4
go test runtime -short -timeout=120s -cpu=1,2,4
if errorlevel 1 goto fail
-echo .
+echo.
echo # sync -cpu=10
go test sync -short -timeout=120s -cpu=10
if errorlevel 1 goto fail
-echo .
+echo.
:: TODO: The other tests in run.bash, especially $GOROOT/test/run.
コアとなるコードの解説
変更は非常にシンプルで、echo .
の全てのインスタンスが echo.
に置き換えられています。
-
echo .
からecho.
への変更:echo .
は、echo
コマンドの後にスペースとピリオドが続く形式です。これは、環境によってはピリオドそのものを表示したり、ECHO
設定を表示したりする可能性があり、安定して改行を出力する保証がありませんでした。echo.
は、echo
コマンドの直後にピリオドが続く形式です。これは、Windowsバッチファイルにおいて、確実に改行のみを出力するための標準的かつ推奨される方法です。ピリオドがecho
コマンドの特殊な引数として解釈され、結果として改行が生成されます。
-
コメントの削除 (
src/make.bat
のみ)::: Echo with no arguments prints whether echo is turned on, so echo dot.
というコメントが削除されています。このコメントは、echo .
を使用していた理由を説明していましたが、echo.
に変更されたことで、その説明が不要になったため削除されました。新しいecho.
の形式は、引数なしのecho
とは異なり、ECHO
設定を表示する心配がないためです。
この変更により、GoのビルドおよびテストスクリプトがWindows環境で実行された際に、出力される改行が常に意図通りになり、スクリプトの実行ログの可読性と安定性が向上しました。
関連リンク
- Go Code Review (Gerrit): https://golang.org/cl/5671072 このリンクは、コミットメッセージに記載されているGoプロジェクトのコードレビューシステム(Gerrit)へのリンクです。通常、ここにはコミットに至るまでの議論や、変更の背景に関する詳細な情報が含まれています。
参考にした情報源リンク
- Windows Batch File
echo
command behavior (e.g.,echo.
vsecho
vsecho .
):- Stack Overflow: How to print a blank line in a Windows batch file?
- SS64.com: ECHO - Display message or turn command echoing on/off
- Microsoft Docs: echo
(これらのリンクは、
echo
コマンドの挙動、特に改行出力に関する一般的な知識を補完するために参照しました。)
# [インデックス 11977] ファイルの概要
このコミットは、Go言語プロジェクトのWindowsバッチスクリプトである `src/make.bat` と `src/run.bat` における、改行出力の方法を修正するものです。具体的には、`echo .` (echo の後にスペースとピリオド) を `echo.` (echo の後にピリオドのみ) に変更することで、より確実に改行を出力するようにしています。
## コミット
- **コミットハッシュ**: `7fc47928fc807a0c79c5649d7ee9e10d55f3c360`
- **作者**: Hector Chu <hectorchu@gmail.com>
- **日付**: 2012年2月16日 木曜日 20:49:50 UTC
- **コミットメッセージ**:
make.bat, run.bat: echo newlines
R=golang-dev, rsc CC=golang-dev https://golang.org/cl/5671072
## GitHub上でのコミットページへのリンク
[https://github.com/golang/go/commit/7fc47928fc807a0c79c5649d7ee9e10d55f3c360](https://github.com/golang/go/commit/7fc47928fc807a0c79c5649d7ee9e10d55f3c360)
## 元コミット内容
make.bat, run.bat: echo newlines
R=golang-dev, rsc CC=golang-dev https://golang.org/cl/5671072
## 変更の背景
Windowsのコマンドプロンプト(バッチファイル)において、`echo` コマンドは通常、引数なしで実行すると現在の `ECHO` 設定(`ECHO is ON.` または `ECHO is OFF.`)を表示します。しかし、単に改行を出力したい場合、慣習的に `echo.` や `echo/` といった形式が用いられます。
このコミット以前の `make.bat` および `run.bat` では、改行を出力するために `echo .` (echo の後にスペースとピリオド) が使用されていました。この形式は、特定の環境やコマンドプロンプトのバージョンによっては、期待通りに改行を出力せず、代わりに `.` (ピリオド) そのものを出力してしまう、あるいは `ECHO` 設定を表示してしまうといった、意図しない挙動を示す可能性がありました。
この変更は、Goプロジェクトのビルドおよびテストスクリプトが、Windows環境で常に期待通りに改行を出力し、スクリプトの出力が読みやすくなるようにするために行われました。特に、ビルドやテストの各ステップの区切りとして改行が使われていたため、その表示の安定性が求められました。
## 前提知識の解説
### Windowsバッチファイルの `echo` コマンド
`echo` コマンドは、Windowsのコマンドプロンプト(`cmd.exe`)で使用される内部コマンドで、主に以下の用途で使われます。
1. **文字列の表示**: `echo Hello World` のように、指定した文字列を標準出力に表示します。
2. **ECHO 設定の表示/変更**:
* `echo` (引数なし): 現在の `ECHO` 設定(`ECHO is ON.` または `ECHO is OFF.`)を表示します。
* `echo on`: コマンドプロンプトでのコマンド表示を有効にします。
* `echo off`: コマンドプロンプトでのコマンド表示を無効にします。バッチファイルの先頭に `@echo off` と記述することで、スクリプト内のコマンド自体が表示されなくなり、出力がすっきりします。
3. **改行の出力**: これが今回のコミットの核心です。
* **`echo.`**: `echo` の直後にピリオドを置くことで、確実に改行を出力する最も一般的な方法です。ピリオドは、`echo` コマンドが「表示すべき文字列がある」と認識するための最小限の引数として機能し、その結果として改行が生成されます。
* **`echo/`**: スラッシュを使用する方法も同様に改行を出力します。
* **`echo ` (echo の後にスペースのみ)**: この形式は、`echo` 設定を表示してしまうため、改行目的では使用できません。
* **`echo .` (echo の後にスペースとピリオド)**: この形式は、`echo` コマンドが「`.` という文字列を表示する」と解釈する場合と、「改行を出力する」と解釈する場合があり、環境やコマンドプロンプトのバージョン、あるいは `ECHO` 設定の状態によって挙動が不安定になることが知られています。特に、`echo` が `ON` の状態では `.` が表示され、`echo` が `OFF` の状態では改行のみが表示されるといった挙動の違いが見られることがあります。この不安定性が、今回の修正の動機となっています。
### Go言語のビルドシステムにおけるバッチファイルの役割
Go言語の初期のビルドシステムでは、クロスプラットフォーム対応のため、Unix系のシェルスクリプト(`make.bash` や `run.bash` など)と、Windows向けのバッチスクリプト(`make.bat` や `run.bat` など)が並行して存在していました。これらのスクリプトは、Goコンパイラや標準ライブラリのビルド、テストの実行といった、プロジェクトの基本的な開発ワークフローを自動化するために使用されていました。
`make.bat` は主にGoのツールチェイン(コンパイラ、リンカなど)や標準ライブラリのビルドを担当し、`run.bat` はビルドされたGo環境を使って各種テストを実行する役割を担っていました。これらのスクリプトの出力は、ビルドやテストの進行状況を開発者に伝える上で重要であり、特に改行による区切りは、出力の可読性を高めるために不可欠でした。
## 技術的詳細
このコミットの技術的詳細は、Windowsバッチスクリプトにおける `echo` コマンドの挙動の微妙な違いに集約されます。
従来の `echo .` という記述は、`echo` コマンドが「`.` という文字列を表示する」と解釈される可能性がありました。これは、`echo` の後に続くスペースが引数とコマンドを区切るものと見なされ、その後のピリオドが単なる文字列として扱われるためです。この場合、期待される改行ではなく、実際にピリオドが表示されてしまいます。
一方、`echo.` という記述は、`echo` コマンドが「引数なし」と解釈されることを防ぎつつ、かつ表示すべき具体的な文字列がない(ピリオドがコマンドの一部として解釈される)ため、結果として改行のみが出力されるという、より安定した挙動を示します。これは、`echo` の直後に続く記号(ピリオドやスラッシュなど)が、`echo` コマンドの特殊な引数として扱われるためです。
この修正は、GoプロジェクトのWindowsビルド環境において、ビルドログやテスト結果の出力が常に整形され、読みやすい状態を保つことを保証します。特に、自動化されたCI/CD環境などでは、スクリプトの出力が安定していることが重要であり、このような細かな修正が全体の信頼性向上に寄与します。
## コアとなるコードの変更箇所
このコミットでは、`src/make.bat` と `src/run.bat` の2つのファイルが変更されています。変更内容は、`echo .` を `echo.` に置き換えることです。
### `src/make.bat` の変更
```diff
--- a/src/make.bat
+++ b/src/make.bat
@@ -38,8 +38,7 @@ if errorlevel 1 goto fail
if errorlevel 1 goto fail
call env.bat
del env.bat
-:: Echo with no arguments prints whether echo is turned on, so echo dot.
-echo .
+echo.
echo # Building compilers and Go bootstrap tool.
set buildall=-a
@@ -49,7 +48,7 @@ if errorlevel 1 goto fail
:: Delay move of dist tool to now, because bootstrap cleared tool directory.
move .\\cmd\\dist\\dist.exe %GOTOOLDIR%\\dist.exe
%GOTOOLDIR%\\go_bootstrap clean -i std
-echo .
+echo.
if not %GOHOSTARCH% == %GOARCH% goto localbuild
if not %GOHOSTOS% == %GOOS% goto localbuild
@@ -63,14 +62,14 @@ set GOARCH=%GOHOSTARCH%\
%GOTOOLDIR%\\go_bootstrap install -v std
endlocal
if errorlevel 1 goto fail
-echo .
+echo.
:mainbuild
echo # Building packages and commands.
%GOTOOLDIR%\\go_bootstrap install -a -v std
if errorlevel 1 goto fail
del %GOTOOLDIR%\\go_bootstrap.exe
-echo .
+echo.
if x%1==x--no-banner goto nobanner
%GOTOOLDIR%\\dist banner
src/run.bat
の変更
--- a/src/run.bat
+++ b/src/run.bat
@@ -18,23 +18,23 @@ if x%1==x--no-rebuild goto norebuild
echo # Building packages and commands.
go install -a -v std
if errorlevel 1 goto fail
-echo .
+echo.
:norebuild
echo # Testing packages.
go test std -short -timeout=120s
if errorlevel 1 goto fail
-echo .
+echo.
echo # runtime -cpu=1,2,4
go test runtime -short -timeout=120s -cpu=1,2,4
if errorlevel 1 goto fail
-echo .
+echo.
echo # sync -cpu=10
go test sync -short -timeout=120s -cpu=10
if errorlevel 1 goto fail
-echo .
+echo.
:: TODO: The other tests in run.bash, especially $GOROOT/test/run.
コアとなるコードの解説
変更は非常にシンプルで、echo .
の全てのインスタンスが echo.
に置き換えられています。
-
echo .
からecho.
への変更:echo .
は、echo
コマンドの後にスペースとピリオドが続く形式です。これは、環境によってはピリオドそのものを表示したり、ECHO
設定を表示したりする可能性があり、安定して改行を出力する保証がありませんでした。echo.
は、echo
コマンドの直後にピリオドが続く形式です。これは、Windowsバッチファイルにおいて、確実に改行のみを出力するための標準的かつ推奨される方法です。ピリオドがecho
コマンドの特殊な引数として解釈され、結果として改行が生成されます。
-
コメントの削除 (
src/make.bat
のみ)::: Echo with no arguments prints whether echo is turned on, so echo dot.
というコメントが削除されています。このコメントは、echo .
を使用していた理由を説明していましたが、echo.
に変更されたことで、その説明が不要になったため削除されました。新しいecho.
の形式は、引数なしのecho
とは異なり、ECHO
設定を表示する心配がないためです。
この変更により、GoのビルドおよびテストスクリプトがWindows環境で実行された際に、出力される改行が常に意図通りになり、スクリプトの実行ログの可読性と安定性が向上しました。
関連リンク
- Go Code Review (Gerrit): https://golang.org/cl/5671072 このリンクは、コミットメッセージに記載されているGoプロジェクトのコードレビューシステム(Gerrit)へのリンクです。通常、ここにはコミットに至るまでの議論や、変更の背景に関する詳細な情報が含まれています。
参考にした情報源リンク
- Windows Batch File
echo
command behavior (e.g.,echo.
vsecho
vsecho .
):- Stack Overflow: How to print a blank line in a Windows batch file?
- SS64.com: ECHO - Display message or turn command echoing on/off
- Microsoft Docs: echo
(これらのリンクは、
echo
コマンドの挙動、特に改行出力に関する一般的な知識を補完するために参照しました。)