座敷牢日誌

都落ちした元SEがソフトウェアやネット関連のことを書いています

bashで * が意図しないワイルドカード展開される場合の対処

C言語ソースコードの1行の文字数を80までにする必要があって, チェックツールなどが用意されているわけではなかったので, bashでチェックしようとしてハマったこと.

#!/usr/bin/env bash
row=1
while read line; do
    chars=$(($(echo $line | wc -c) - 1))
    if [ $chars -gt 80 ]; then
        printf "filename %s, row %d, characters %d\n" "$1" $row $chars
    fi
    row=$(($row + 1))
done < <(iconv -f UTF-8 -t CP932 $1)

こんな感じのスクリプトを用意して, 80文字を超える行があったら, そのファイル名と行番号と文字数を出力しようとしていたが, 文字数が80文字を大きく超過した行が大量に出てきた.

なんでかなあと思ったら, *ワイルドカードとして展開されていた. line 変数の中身が /* だとすると, / 直下のアイテムが列挙されているということ.

#!/usr/bin/env bash
while read line; do echo $line; done <<EOF
/*
EOF

このようなスクリプトを実行すると, 次のように出力されてしまう.

/bin /boot /dev /etc /home /lib /lib64 /lost+found /mnt /opt /proc /root /run
/sbin /srv /sys /tmp /usr /var

回避するには, $line をダブルクォートでくくってやればよい.

#!/usr/bin/env bash
while read line; do echo "$line"; done <<EOF
/*
EOF

これで, /* と出力されるようになるから, ここから文字数の評価もできるようになる. ちなみにシングルクォートでくくると, $line と出力されるようになる.

シェルのクォーティングの有無による挙動の違いってすぐに忘れてしまう.

CakePHP on Docker Compose を公開した

いつぞや書いたDocker ComposeでCakePHPの開発環境をこしらえる記事 について, Docker ComposeのためのファイルをBitbucketで公開しました.

https://bitbucket.org/kuchida1981/cakephp-on-dockercompose

使い方をREADMEにまとめています.

可搬性なんかを意識して .env ファイルを使ってみたりしました.

SSHで接続したBoot2Dockerでrootへ昇格するには

Docker MachineのドライバにVirtualBoxを使うと, Boot2DockerというLinuxディストリビューションがDockerホストになる.

docker-machine ssh でBoot2Dockerへログインしてから, rootに昇格するにはどうしたらいいか?

sudo -iOK.

kosuke% docker-machine ssh
                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 1.13.1, build HEAD : b7f6033 - Wed Feb  8 20:31:48 UTC 2017
Docker version 1.13.1, build 092cba3
docker@default:~$ whoami
docker
docker@default:~$ sudo -i
Boot2Docker version 1.13.1, build HEAD : b7f6033 - Wed Feb  8 20:31:48 UTC 2017
Docker version 1.13.1, build 092cba3
root@default:~# whoami
root
root@default:~#