🐷

redirect outputで無限ループ

2021/12/31に公開

過去に無限ループやらかしでハマったやつを教訓として残すメモ

#!/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