NYAGOS 4.2.5 のリリースと環境変数の扱い

no extension

(正式版がリリースされたので改題しました)

NYAGOS 4.2.5 がリリースされた。

以下に変更点をまとめて紹介する。

  • Read the value of environment variables and the current directory that a batchfile changed like CMD.EXE.
  • And refactored a lot of source files
  • Fix: #296 the batchfile could not be executed when the username contains multibyte-character.
    • Fix that the encoding of the temporary batchfile was UTF8.
    • Fix that the end of the each line of the temporary batchfile was LF not CRLF.
  • Fix: #297 running the batchfile includes exit without /b option, an error occurs
  • Add Lua-flag: nyagos.option.usesource. When it is false, batchfiles can not change nyagos’s environment variables and directory.(default:true)

  • CMD.EXE と同様に、バッチファイルが変更した環境変数・カレントディレクトリを読み取るようにした。
  • ソースの幾つかを派手にリファクタリングした。
  • #296 ユーザ名にマルチバイト文字が入っていると、バッチが正常動作しない不具合を修正
    • 一時バッチファイルのエンコーディングが UTF8 になっていた
    • 一時バッチファイルの改行コードが CRLF ではなく LF になっていた
  • #297 /b なしの exit をバッチファイルが実行した時、一時ファイルが無い旨のエラーがでていた
  • luaフラグ nyagos.option.usesource を追加。false の時、バッチファイルは NYAGOS の環境変数を変更できなくなる(default:true)
via Release 4.2.5

というわけで,このバージョンからバッチファイル(*.bat, *.cmd)実行時の環境変数の扱いが変わるようだ。 詳しくは以下を参照のこと。

個人的にはバッチファイルで環境変数が汚れるのは好みではなかったので source コマンドのみで環境変数を変えられるという仕様は結構気に入っていたのだが,まぁいいか。 問題ない。

【追記 2018-03-31】 nyagos.option.usesource オプションを追加していただいた。 これを false にすれば従来どおり source コマンドのみで環境変数を変更できる。 ホームディレクトリの .nyagos に追記しておけばいいだろう。

【追記 2018-04-18】 NYAGOS 4.2.5_1 がリリース

不具合の修正のみ。

  • Fix: if [not] errorlevel N did not work on block-if.
  • Fix: that ls -1F did not show the indicator such as /,* or @.
  • Fix: the problem that executables reparse-pointed but not symbolic-linked can not be found. ★
  • Fix: ls -F marked ‘@’ to files and directories which ar reparse-pointed but not symbolic-link nor junction
  • Changed the error message when the command history is called in _nyagos

★ This is the reason that executables in OneDrive can not be called.


  • ブロックif で if [not] errorlevel N が動かなかった不具合を修正
  • リパースポイント先の実行ファイルが見付からなくなっている問題を修正(※)
  • ls -1F/,*@ といったインジケーターを出力しない問題を修正
  • ls -F が「リパースポイントではあるが、ジャンクション、シンボリックリンクでないファイル・ディレクトリ」に @ マークをつけていた不具合を修正
  • _nyagos で history コマンドを使った時のエラーメッセージを変更

(※ OneDrive の下においた実行ファイルが実行できなくなる問題の原因がコレです)

via Release 4.2.5_1

【付録】 環境変数の汚染を防ぐには

バッチファイルで環境変数を汚さないようにするには setlocal ... endlocal で囲めばよい1。 しかも入れ子にできる。 たとえばフィボナッチ数を数え上げる処理はこんな感じ2

@echo off
setlocal

setlocal enabledelayedexpansion

set /a n = %~1
set /a b1 = 0
set /a b2 = 0

if %n% == 1 echo 1: %b2% && goto :end
echo 1: %b2%
set /a b2 = 1
if %n% == 2 echo 2: %b2% && goto :end
echo 2: %b2%
for /l %%i in (3, 1, %n%) do (
    set /a fib = !b1! + !b2!
    set /a b1 = !b2!
    set /a b2 = !fib!
    echo %%i: !b2!
)

:end
endlocal && set /a fib = %b2%

echo %~1th Fibonacci number is %fib%
endlocal 

endlocal && set /a fib = %b2%setlocal ... endlocal スコープの外に値を持ち出している点に注目。

これを実行すると以下のようになる。

C:> fibonacci.cmd 10
1: 0
2: 1
3: 1
4: 2
5: 3
6: 5
7: 8
8: 13
9: 21
10: 34
10th Fibonacci number is 34

C:> set fib
環境変数 fib が定義されていません

C:> set b2
環境変数 b2 が定義されていません

ブックマーク


  1. 時々 setlocalendlocal がペアになっていない記述を見かける(特に遅延環境変数の説明とか)。 endlocal がなくても別にエラーになったりはしないしちゃんと動くのだが(バッチ終了時に全スコープが閉じられるので),プログラマならスコープは正しく書こうね。 [return]
  2. コード内の enabledelayedexpansion は遅延環境変数を有効にするオプション。 !fib! などがこれに該当する。 for 文や if 文の ( ... ) で囲まれた部分で環境変数を操作する場合に必要。遅延環境変数は setlocal ... endlocal スコープ内でしか有効にできない点に注意。 [return]