アカウント名:
パスワード:
てっきり最初にスクリプト全部読み込んでから走らせてると思ってた。
京大での事故で広く知られたように、シェルは最初にスクリプト全体を読み込むのではなく、「1行ずつ順次読み込む。そしてスクリプト終端に達したり exit や致命的エラーなどによりスクリプトは終了する。
走らせているスクリプトを変更する機会は今までになかった。期待どおりに動いていないのがわかったらkillしてから書き換えてるし。それでも、本番で長時間走らせている時に不具合見つかったらやっちゃうのかな。
スクリプトを改変するときはバックアップ後に別名コピーしてテストして問題がなければ元の名前に上書きしてた。小手先処理の簡単なスクリプトしか作らないので、バージョン管理とかその手のことはやってない現場仕事ですが。ループがあっても小さいものだし、それくらいなら最初に全部読み込まれそう。
Windowsのbatファイルも同じ感じだよね。↓みたいなの書いてpause中にファイル編集してみるとわかる。
echo 1pauseecho 2pauseecho 3pauseecho 4
echo 1pauseecho 2pause
となっているとき、1回目の pause 時に1行目を「echo ABCDEFGHIJKLMNOPQRSTUVWXYZ」に書き換えたら、「'KLMNOPQRSTUVWXYZ' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。」ってエラーメッセージを出した。なるほど、「pause(CR)(LF)」の次の位置を憶えていてそこから再開しようとするのか。
覚え違えかもだけど、すごい昔の日本語DOSか、MS-DOSか、PC-DOSかCP/Mだかはメモリに読み込んでた記憶があるような。BATが入ったフロッピーディスクを途中で入れ替えする事が有るからメモリにある程度バッファリングしてたのかな。
現在のBATは実行中に書き換えると、上記のようにファイルポインタ位置でずれて意図しない現象が起きるので危険です。
昔のMS-DOSというと
COPY *.TXT HOGE.TXT
でファイル破壊する仕様があったような……。HOGE.TXTがあると上書きを始めちゃうから、ワイルドカードの展開でHOGE.TXTの番になったところでMS-DOSができないことを検出してエラーで止めるものの、その時点でHOGE.TXTの中身は破壊されているという
今は「一時ファイルを作って最後にHOGE.TXTに上書きする」みたいな処理にして回避してそう
MS-DOSすっかり忘れたcat *.TXT >> HOGE.TXTでよさげ
MS-DOSでテキストを表示するのはcatではなく TYPE コマンドですよ。さらに、COMMAND.COM のTYPEコマンドはワイルドカードに対応してないので、 TYPE *.TXT はできません
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
目玉の数さえ十分あれば、どんなバグも深刻ではない -- Eric Raymond
しらんかった (スコア:5, 参考になる)
てっきり最初にスクリプト全部読み込んでから走らせてると思ってた。
京大での事故で広く知られたように、シェルは最初にスクリプト全体を読み込むのではなく、「1行ずつ順次読み込む。そしてスクリプト終端に達したり exit や致命的エラーなどによりスクリプトは終了する。
走らせているスクリプトを変更する機会は今までになかった。
期待どおりに動いていないのがわかったらkillしてから書き換えてるし。
それでも、本番で長時間走らせている時に不具合見つかったらやっちゃうのかな。
スクリプトを改変するときはバックアップ後に別名コピーしてテストして問題がなければ元の名前に上書きしてた。
小手先処理の簡単なスクリプトしか作らないので、バージョン管理とかその手のことはやってない現場仕事ですが。
ループがあっても小さいものだし、それくらいなら最初に全部読み込まれそう。
Re: (スコア:1)
Windowsのbatファイルも同じ感じだよね。
↓みたいなの書いてpause中にファイル編集してみるとわかる。
echo 1
pause
echo 2
pause
echo 3
pause
echo 4
Re: (スコア:1)
echo 1
pause
echo 2
pause
となっているとき、1回目の pause 時に1行目を「echo ABCDEFGHIJKLMNOPQRSTUVWXYZ」に書き換えたら、
「'KLMNOPQRSTUVWXYZ' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。」
ってエラーメッセージを出した。
なるほど、「pause(CR)(LF)」の次の位置を憶えていてそこから再開しようとするのか。
Re: (スコア:0)
覚え違えかもだけど、すごい昔の日本語DOSか、MS-DOSか、PC-DOSかCP/Mだかはメモリに読み込んでた記憶があるような。
BATが入ったフロッピーディスクを途中で入れ替えする事が有るからメモリにある程度バッファリングしてたのかな。
現在のBATは実行中に書き換えると、上記のようにファイルポインタ位置でずれて意図しない現象が起きるので危険です。
Re: (スコア:0)
昔のMS-DOSというと
COPY *.TXT HOGE.TXT
でファイル破壊する仕様があったような……。
HOGE.TXTがあると上書きを始めちゃうから、ワイルドカードの展開でHOGE.TXTの番になったところで
MS-DOSができないことを検出してエラーで止めるものの、その時点でHOGE.TXTの中身は破壊されているという
今は「一時ファイルを作って最後にHOGE.TXTに上書きする」みたいな処理にして回避してそう
Re: (スコア:0)
MS-DOSすっかり忘れた
cat *.TXT >> HOGE.TXT
でよさげ
Re:しらんかった (スコア:2)
MS-DOSでテキストを表示するのはcatではなく TYPE コマンドですよ。
さらに、COMMAND.COM のTYPEコマンドはワイルドカードに対応してないので、 TYPE *.TXT はできません