🐷
redirect outputで無限ループ
過去に無限ループやらかしでハマったやつを教訓として残すメモ
#!/bin/bash
function run_sample {
f2=$1
# do something
}
f1=/tmp/a.txt
f2=/tmp/a.tmp
echo "a" > "$f1"
run_sample "$f1"
cat "$f1" >> "$f2"
上記コード、実行すると無限ループになる.
どこが悪いかわかるだろうか..?
これは無限ループで放っておくとファイルサイズがどんどん増える.
$ ls -lha /tmp/a.txt
-rw-r--r-- 1 mattak wheel 1.0M 12 31 22:42 /tmp/a.txt
答えは、global変数のf2をfunction内部で上書きしてしまっているから、下記の実行コマンドでループする.
cat /tmp/a.txt >> /tmp/a.txt
ファイル内容を読み出して、appendで追加して、読み出しての無限ループになり、最終的にdiskが枯渇するまでは走り続ける.
対処としては、local
を使ってスコープを絞る感じ.
function run_sample {
local f2
f2=$1
# do something
}
localについては過去にも記事にした。
shell のlocal宣言 注意事項 ⚠️
今年一番のやらかしだった気がするので教訓として残す.
Discussion