少しハマったシェルスクリプト

2013 年 9 月 24 日 | タグ:

TA中に妙なところで「思った通りに動かない」ということがあったので追っかけてみました。
その場に一緒に居た某kono研の人とか某B3が見てるだろうと信じて。

echo -n

シェルスクリプト書いてるとログ出力時とかによく使う
echo -n
なんですが、Macではどうやら正しく動作しない模様。
コマンドライン上では正しく動くけど、スクリプト内だとダメでした。

[bash]
$ vi test.sh
#!/bin/sh
echo -n test

$ sh test.sh
-n test
$
[/bash]
みたいになります。

対応策:/bin/echo を使いましょう。

対応策からも予想がつくかもしれませんが、built-inが…。
[bash]
$ where echo
echo: shell built-in command
/bin/echo
[/bash]

ぐぐってみると同じ感じの記事がありました。

find

あともう一つ、
[bash]
# 正しい挙動
$ find . -name "*.txt" -print0

# 間違った挙動
$ find . -print0 -name "*.txt"
[/bash]
上の二つはそれぞれ出力が変わります。
-print0 についてman読むと「0を返す」みたいなことが書かれてたので、-print0の時点で終了するのかな、とか。

実際、以下と結果は同じになります。
[bash]
find . -print0
[/bash]

こういうのってどうやって確かめたらいいんですかね。
traceして見てみましたけど、多分あってるんじゃないかな〜、ぐらいです。

sshとかでも微妙にハマったところあったりで、繰り返しやってることでも割と躓くことは多いな〜、と。
ちなみにこれは$HOMEの権限が775だったことが原因でした。

というわけでTAは今日で終わりでした〜。
夏休みだー、とか思ったら今日から後期だそうな。
進捗どうですか?
Answer: 進捗駄目です
はい。

  1. 2013 年 9 月 25 日 19:44

    echo -nについては、動作確認時のshellが違うだけのような。
    動作確認時にzshのビルトインを使ってて、shスクリプト内ではbashのビルトインを使ってるよね。

    findの-print0は知りませんでしたw

  2. k138572
    2013 年 9 月 29 日 18:20

    shebangを以下の通り変更させて試してみました。
    #!/bin/sh
    #!/bin/zsh
    #!/bin/bash

    スクリプト内では
    which echo
    echo -n test
    としているのですが、結果はどれも

    /bin/echo
    -n test

    となりました。
    whichの結果は”/bin/echo”となっていますが、明らかに使われていませんね…。
    shebangを変えた時にスクリプト内のbuiltinが変わるかどうかも確かめたいところですが、どうしたら良いのか…というところです。

  3. 2013 年 10 月 1 日 09:25

    手元で試す限りでは、
    #!/bin/sh→/bin/echoで-nが効かない。
    #!/bin/zsh→shell built-in commandで-nが効く。
    という風に動作が異なるのだけど、何か他に要因があったりするのかなぁ。

    あ、実行時にはchmodして直接スクリプトファイルを実行してます。
    「sh test.sh」のようにするとshebangは無視されますね。

  4. k138572
    2013 年 10 月 1 日 10:10

    >あ、実行時にはchmodして直接スクリプトファイルを実行してます。
    >「sh test.sh」のようにするとshebangは無視されますね。

    これのせいでした…。

    #!/bin/sh
    -> -n が効かない

    #!/bin/zsh
    #!/bin/bash
    -> -n が効く

    になりました!
    zshではwhichの結果がbuilt-inでしたが、shとbashでは/bin/echoって出ますね。
    sh と bash の違いになるんでしょうか…。

  5. 2013 年 10 月 1 日 21:31

    あれ、bashでも-nが効くようになったのか。
    diffでは違うと言われるけどsh/bash –versionする限りでは一緒か。謎だw

  6. k138572
    2013 年 10 月 2 日 23:05

    shとbashってman見てる感じでは同じなはずなんですけどね…。
    あと、Linuxではちゃんとできた(はず)です。
    BSDは、手元にないので試してません…。