Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 11977] ファイルの概要

このコミットは、Go言語プロジェクトのWindowsバッチスクリプトである src/make.batsrc/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)で使用される内部コマンドで、主に以下の用途で使われます。

  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 設定の状態によって挙動が不安定になることが知られています。特に、echoON の状態では . が表示され、echoOFF の状態では改行のみが表示されるといった挙動の違いが見られることがあります。この不安定性が、今回の修正の動機となっています。

Go言語のビルドシステムにおけるバッチファイルの役割

Go言語の初期のビルドシステムでは、クロスプラットフォーム対応のため、Unix系のシェルスクリプト(make.bashrun.bash など)と、Windows向けのバッチスクリプト(make.batrun.bat など)が並行して存在していました。これらのスクリプトは、Goコンパイラや標準ライブラリのビルド、テストの実行といった、プロジェクトの基本的な開発ワークフローを自動化するために使用されていました。

make.bat は主にGoのツールチェイン(コンパイラ、リンカなど)や標準ライブラリのビルドを担当し、run.bat はビルドされたGo環境を使って各種テストを実行する役割を担っていました。これらのスクリプトの出力は、ビルドやテストの進行状況を開発者に伝える上で重要であり、特に改行による区切りは、出力の可読性を高めるために不可欠でした。

技術的詳細

このコミットの技術的詳細は、Windowsバッチスクリプトにおける echo コマンドの挙動の微妙な違いに集約されます。

従来の echo . という記述は、echo コマンドが「. という文字列を表示する」と解釈される可能性がありました。これは、echo の後に続くスペースが引数とコマンドを区切るものと見なされ、その後のピリオドが単なる文字列として扱われるためです。この場合、期待される改行ではなく、実際にピリオドが表示されてしまいます。

一方、echo. という記述は、echo コマンドが「引数なし」と解釈されることを防ぎつつ、かつ表示すべき具体的な文字列がない(ピリオドがコマンドの一部として解釈される)ため、結果として改行のみが出力されるという、より安定した挙動を示します。これは、echo の直後に続く記号(ピリオドやスラッシュなど)が、echo コマンドの特殊な引数として扱われるためです。

この修正は、GoプロジェクトのWindowsビルド環境において、ビルドログやテスト結果の出力が常に整形され、読みやすい状態を保つことを保証します。特に、自動化されたCI/CD環境などでは、スクリプトの出力が安定していることが重要であり、このような細かな修正が全体の信頼性向上に寄与します。

コアとなるコードの変更箇所

このコミットでは、src/make.batsrc/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)へのリンクです。通常、ここにはコミットに至るまでの議論や、変更の背景に関する詳細な情報が含まれています。

参考にした情報源リンク

# [インデックス 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)へのリンクです。通常、ここにはコミットに至るまでの議論や、変更の背景に関する詳細な情報が含まれています。

参考にした情報源リンク