質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

解決済

2回答

8165閲覧

#!/usr/bin/env sh この表記のシェバングは本当に必要なの?

eisaku123

総合スコア74

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

1クリップ

投稿2017/08/25 02:07

いつもお世話になります。
表記のシェバング行はあっても無くても、実行できてしまいます。

シェバングについてネットでも調べました。
env をつけると引数なしでよいとか。。。
また 最後にsh て何んだろう。。シェルスクリプトかなとか

まずエラーをだず方法ってあるのでしょうか?

このままだと永遠にシェバング行の表記をスルーして、理解せずに
ごまかしプログラマーになりそうです。

#!/usr/bin/env sh cd /home/pi/toku1/08-11-a3 python3 sample_09_distance_measuring_sensor.py

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

eisaku123

2017/08/25 04:48

>>シバンは、+x属性を付けて(./***.shのような形で)ファイル自体を実行>>する場合に必要なものです。 シバンを無くしても実行できまたよ。 >>シバンで直接書くのが煩雑になるし、環境によっても変化するので、対>>策として#!/usr/bin/env rubyのように書くことがありますが 対策しなかったらどんな書き方になるでしょうか?
Tak1016

2017/08/25 05:02

.sh って拡張子をつけてるから シバン無しでもshって認識するのでは、って思いました。 まあ 基本 bashで実行してるであれば既定値bashですよねって解釈されてるのもあると思います。 perlなどの他言語の場合、威力を発揮するのかなと思ったりしました。
eisaku123

2017/08/25 06:38

いろいろなアドバイスありがとうございます。 結局、初心者にとって、matobaa さんの回答の運用段階を重視しなければ、シバンはとりあえず、 おまじない程度と思っておけばよいと解釈すればよいでしょうか?
maisumakun

2017/08/25 06:40

シェルから自分で叩いて実行する分にはそうかもしれませんが、cronやGit hookなど、「シェル以外から実行されるコード」の場合にはどうなるかわかりません。
guest

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
matobaa

総合スコア2493

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2017/08/25 03:58

シンタックスハイライトが「#!/bin/teratail」だけ違うということで、何かを認識しているっぽいですね。
eisaku123

2017/08/25 04:12

fileコマンドで確認できるようにする必要性があることは認識しました。
eisaku123

2017/08/25 11:14

[ a == a ] の構文がdash、bash、sh によって成立不成立があるよ ということでしょうか?
matobaa

2017/08/25 12:19 編集

そのとおりです。== は bash で使えますが dash、shではエラーになることを利用し、どのように記述してどのように実行したら期待したシェルで実行されるのか、を表にしました。
eisaku123

2017/08/25 12:22

ありがとうございます。これで、シェバンの存在価値がわかりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問