いつもお世話になります。
表記のシェバング行はあっても無くても、実行できてしまいます。
シェバングについてネットでも調べました。
env をつけると引数なしでよいとか。。。
また 最後にsh て何んだろう。。シェルスクリプトかなとか
まずエラーをだず方法ってあるのでしょうか?
このままだと永遠にシェバング行の表記をスルーして、理解せずに
ごまかしプログラマーになりそうです。
#!/usr/bin/env sh cd /home/pi/toku1/08-11-a3 python3 sample_09_distance_measuring_sensor.py
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答2件
0
シバンは、+x属性を付けて(./***.sh
のような形で)ファイル自体を実行する場合に必要なものです。sh ***.sh
のようにシェルの引数に投げるだけであれば特に不要です。
単にシェルスクリプトを書く場合は、#!/bin/sh
(厳密にshの文法で書く場合)、あるいは#!/bin/bash
(Bash拡張を使う場合)をおすすめします。shやbashの置き場が違う環境は、あまりありません。
Rubyの場合、(特にrbenvを挟むなど複雑な環境でRubyを立ち上げないといけない場合もあるので)シバンで直接書くのが煩雑になるし、環境によっても変化するので、対策として#!/usr/bin/env ruby
のように書くことがありますが、あまり行儀がいいとはいえませんし、シェルスクリプトの場合は通常そのようなことをしないので不要です。
投稿2017/08/25 02:25
編集2017/08/25 02:26総合スコア146506
0
ベストアンサー
システム目線での必要性は maisumakun さんの回答のとおりです。
ただ、私の回答はちょっと違います。(考え方の問題ですけど)
shebangは、その「シェルスクリプト」ぽく見えるものがなにものかを宣言するものであり、必ず記載すべきです。
その何かは、bashのスクリプトなのか? shのスクリプトなのか? はたまたシェルスクリプトに似た何かなのか? を宣言するのに有用であり、運用段階での無用のトラブルを防ぐための重要なヒントになります。
fileコマンドはちゃんと教えてくれます。
matobaa@matobaa:~$ cat aaa.sh #!/bin/sh matobaa@matobaa:~$ cat bbb.sh #!/bin/bash matobaa@matobaa:~$ cat ccc.sh #!/usr/bin/env sh matobaa@matobaa:~$ cat ttt.sh #!/bin/teratail matobaa@matobaa:~$ file * aaa.sh: POSIX shell script, ASCII text executable bbb.sh: Bourne-Again shell script, ASCII text executable ccc.sh: a /usr/bin/env sh script, ASCII text executable ttt.sh: a /bin/teratail script, ASCII text executable
追記
+x して直接実行する際、シェルがシェバンを解釈しています。
書かなかったとき、書いたとき、直接実行したとき、シェルにパラメータ渡ししたときはこんな感じ。
| shebang | dashで直接実行 | bashで直接実行 | shにパラメータ渡し | bash にパラメータ渡し |
|:--|:--|:--|
| (かかない) | FALSE | TRUE | FALSE | TRUE |
| #!/bin/sh | FALSE | FALSE | FALSE | TRUE |
| #!/bin/bash | TRUE | TRUE | FALSE | TRUE |
matobaa@matobaa:~$ echo $SHELL /bin/bash matobaa@matobaa:~$ cat ./no.sh [ a == a ] && echo TRUE || echo FALSE matobaa@matobaa:~$ cat ./da.sh #!/bin/sh [ a == a ] && echo TRUE || echo FALSE matobaa@matobaa:~$ cat ./ba.sh #!/bin/bash [ a == a ] && echo TRUE || echo FALSE matobaa@matobaa:~$ dash \[\e]0;matobaa\a\]\u@matobaa:\w$ \[\033kmatobaa\033\\]./no.sh ./no.sh: 1: [: a: unexpected operator FALSE \[\e]0;matobaa\a\]\u@matobaa:\w$ \[\033kmatobaa\033\\]./da.sh ./da.sh: 2: [: a: unexpected operator FALSE \[\e]0;matobaa\a\]\u@matobaa:\w$ \[\033kmatobaa\033\\]./ba.sh TRUE \[\e]0;matobaa\a\]\u@matobaa:\w$ \[\033kmatobaa\033\\]exit matobaa@matobaa:~$ ./no.sh TRUE matobaa@matobaa:~$ ./da.sh ./da.sh: 2: [: a: unexpected operator FALSE matobaa@matobaa:~$ ./ba.sh TRUE matobaa@matobaa:~$ sh ./no.sh ./no.sh: 1: [: a: unexpected operator FALSE matobaa@matobaa:~$ sh ./da.sh ./da.sh: 2: [: a: unexpected operator FALSE matobaa@matobaa:~$ sh ./ba.sh ./ba.sh: 2: [: a: unexpected operator FALSE matobaa@matobaa:~$ bash ./no.sh TRUE matobaa@matobaa:~$ bash ./da.sh TRUE matobaa@matobaa:~$ bash ./ba.sh TRUE matobaa@matobaa:~$
投稿2017/08/25 03:21
編集2017/08/25 09:09総合スコア2493
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/25 04:48
2017/08/25 04:59
2017/08/25 05:02
2017/08/25 06:38
2017/08/25 06:40