問題提起
例えば、echoコマンドは
- シェルスクリプト(Linux)、バッチファイル(Windows)などのプログラミング作成時
- ターミナル(Linux)、CLIコンソール(Linux)、コマンドプロンプト(Windows)、PowerShell(Winodws)での利用時
など、OSが異なるさまざまなところで利用できます。
echoコマンド実行時の「改行」に関してOSによって異なる出力結果になることを把握することで、意図しない出力結果や予期せぬプログラムエラーを回避することができます。
OSによるechoコマンド実行時の「改行」の違いについて解説します
OSの違いによるechoコマンドの改行について異なる箇所解説
・最終行から改行され次の行に文字列が入力されてファイル保存(出力)されます。
・最終行は文字列が追加された行になります。
・最終行から改行されないでその続きから文字列が入力されてファイル保存(出力)されます。
・最終行は文字列が追加された次の行になります。
OSによるechoコマンド実行時の改行の違いを確認
LinuxとWindowsでechoコマンドを比較(空白行無し)
Linux
1.変更前の「test.txt」ファイルの状態を確認
※最終行が1行目
2.echoコマンドで文字列を「test.txt」へ追加書込み
※echoコマンドで文字出力
※文字列の出力先は改行する
(2行目に出力)
※最終行は文字を追加した行
(2行目)
Windows
2.変更前の「test.txt」ファイルの状態を確認
※最終行が1行目
2.echoコマンドで文字列を「test.txt」へ追加書込み
※echoコマンドで文字出力
※文字列の出力先は改行しない
(1行目に出力)
※最終行は文字を追加した次の行
(2行目)
LinuxとWindowsでechoコマンドを比較(空白行有り)
Linux
1.変更前の「test.txt」ファイルの状態を確認
※最終行が2行目
2.echoコマンドで文字列を「test.txt」へ追加書込み
※echoコマンドで文字出力
※文字列の出力先は改行する
(3行目に出力)
※最終行は文字を追加した行
(3行目)
Windows
2.変更前の「test.txt」ファイルの状態を確認
※最終行が2行目
2.echoコマンドで文字列を「test.txt」へ追加書込み
※echoコマンドで文字出力
※文字列の出力先は改行しない
(2行目に出力)
※最終行は文字を追加した次の行
(3行目)
echoコマンドによる改行に注意しないといけないケース
障害になりやすいWindows上でのechoコマンド実行ケース
servicesファイルにechoコマンドで文字列を追加書込みする場合での障害ケースを解説します。
※servicesファイルはtcp・udpの名前を登録するファイルで入力ルールが決まっています。
目的
servicesファイルに「test-srv 50000/tcp #test service」を正しく登録する
実行するechoコマンド
echo "test-srv 50000/tcp #test service" >> C:\Windows\System32\drivers\etc\services
servicesファイルを確認
最終行が「286行目」にあった状態で、上記の「echoコマンド」を実行した場合
echoコマンド実行結果
Windowsは最終行から改行されずに文字列を出力されます。
※echoコマンドでserviceファイルに正しく登録できていません。
(「287行目」以降に登録されている必要があります)
・最終行がどの行にあるか?を確認してからechoコマンドを実行する必要があります。
・今回のケースでは、最終行が「287行目」以降にあるかを確認してからechoコマンドを実行する必要があった。
想定していた文字列の出力結果
Windows上でechoコマンドを実行して文字列をservicesファイルへ正しく追記するには「287行目」以降に最終行がある状態にしておく必要があります。
・最終行が「286行目」にあっても改行されて文字列が出力されます。
・最終行が、「287行目」にあった状態でechoコマンドを実行しても「287行目」が空白行となり「288行目」に文字列が出力されます。
・最終行を気にせずに、servicesファイルのような入力ルールに対応できています。
コメント