タグ付けされた質問 「shebang」

スクリプトの先頭にある「#!」文字列に関する質問の場合は、タグ/ shebangを使用します

9
「#!/ path / to / NAME」の代わりに「#!/ usr / bin / env NAME」をシバンとして使用する方が良いのはなぜですか?
#!/path/to/NAME他の人(同じツールNAMEを使用)がshebang を持っている間に、他の人から取得したスクリプトの中にはshebang を持っていることに気付き#!/usr/bin/env NAMEます。 両方とも正常に動作するようです。チュートリアル(Pythonなど)では、後者の方が優れているという提案があるようです。しかし、なぜそうなのか、私にはよくわかりません。 後者のシバンを使用するには、NAMEがPATHに含まれている必要がありますが、最初のシバンにはこの制限がありません。 また、(私には)NAMEの場所を正確に指定するため、最初の方がより良いシバンになるようです。そのため、この場合、NAMEのバージョンが複数ある場合(たとえば、/ usr / bin / NAME、/ usr / local / bin / NAME)、最初のケースはどちらを使用するかを指定します。 私の質問は、なぜ最初のシバンが2番目のシバンよりも好まれるのかということです。


5
シバンは、スクリプトを実行するシェルを決定しますか?
これはばかげた質問かもしれませんが、私はまだ質問します。シバンを宣言した場合 #!/bin/bash の初めにmy_shell_script.sh、私は常にbashを使用してこのスクリプトを呼び出す必要がありますか [my@comp]$bash my_shell_script.sh または私は例えばを使用できます [my@comp]$sh my_shell_script.sh 私のスクリプトは、シバンを使用して実行中のシェルを決定しますか?kshシェルでも同じことが起こりますか?AIXを使用しています。


3
「//」で始まるシバン?
次のスクリプトについて混乱しています(hello.go)。 //usr/bin/env go run $0 $@ ; exit package main import "fmt" func main() { fmt.Printf("hello, world\n") } 実行できます。(MacOS X 10.9.5の場合) $ chmod +x hello.go $ ./hello.go hello, world から始まるシバンについて聞いたことがありません//。また、スクリプトの先頭に空白行を挿入しても機能します。このスクリプトが機能するのはなぜですか?

6
/ bin / bashではなく/ bin / shを指すシェバンを持つ理由はありますか?
私が見たほとんどのシェルスクリプト(自分で書いていないスクリプトを除く)で、シバンがに設定されていることに気付きました#!/bin/sh。これは古いスクリプトでは本当に驚かないが、かなり新しいスクリプトでもそうだ。 好むための何らかの理由がある/bin/sh以上は、/bin/bash以来、bash十年以上前にうまくいって、多くのLinuxやBSDマシン上で、かなり多くの遍在し、多くの場合、デフォルト?
53 bash  shell  history  shebang 


2
bashスクリプトに.shまたは.bash拡張子を使用しますか?
(Ubuntu-OSXの互換性と使いやすさとPOSIXについては、#!/ bin / shまたは#!/ bin / bashを使用してください) スクリプトでbashシェルを使用する場合、.bash拡張子を使用すると実際にbashが呼び出されるのか、それともシステム構成/最初のシェバン行に依存するのか。両方が有効であるが異なる場合、どちらが優先されますか? スクリプトを.shで終了して「シェルスクリプト」を示すだけで、最初の行でbashシェルを選択する#!/usr/bin/env bashか(例)、または.bashで終了するだけでなく(行1の設定も) )。bashを呼び出したい。
36 bash  shell  shebang 

4
シェルでファイルを実行するとどうなりますか?
だから、私はこれをよく理解していると思ったが、テストを実行して(誰かに反対した会話に応じて)、私の理解に欠陥があることがわかりました... 可能な限り詳細に、シェルでファイルを実行すると正確に何が起こるのでしょうか?私が意味するのは、./somefile some argumentsシェルに入力somefileしてreturnキーを押すと(そしてcwdに存在し、読み取りと実行の許可がありますsomefile)、フードの下で何が起こるのですか? 私が考えた答えでした。 シェルはにsyscallを作成しexec、パスを渡しますsomefile カーネルが調べsomefileではとルックスのマジックナンバーファイルのそれは、プロセッサが処理できる形式であるかどうかを判断します ファイルがプロセッサが実行できる形式であることをマジック番号が示している場合、 新しいプロセスが作成されます(プロセステーブルのエントリを使用) somefile読み取り/メモリにマップされます。スタックが作成され、実行のコードのエントリポイントにジャンプされるsomefileと、ARGVパラメータの配列に初期化(char**、["some","arguments"]) マジック番号がある場合シェバング次いで、exec()上記のように、新しいプロセスを生成するが、実行可能な使用は、インタプリタシェバング(例えばによって参照され/bin/bash又は/bin/perl)とsomefileに渡されSTDIN ファイルに有効なマジックナンバーがない場合、「無効なファイル(不良なマジックナンバー):Execフォーマットエラー」などのエラーが発生します。 ただし、ファイルがプレーンテキストの場合、シェルはコマンドを実行しようとします(入力したかのように)と誰かに言われましたbash somefile。私はこれを信じていませんでしたが、試しただけで、それは正しかったです。ですから、ここで実際に何が起こっているのかについて誤解があり、その仕組みを理解したいと思います。 シェルでファイルを実行するとどうなりますか?(詳細は合理的です...)
32 shell  kernel  exec  shebang 

7
シバングの複数の引数
shebang行(#!)を介して実行可能ファイルに複数のオプションを渡す一般的な方法があるかどうか疑問に思っています。 私はNixOSを使用していますが、私が書くスクリプトの最初の部分は通常/usr/bin/envです。私が遭遇する問題は、その後に来るすべてがシステムによって単一のファイルまたはディレクトリとして解釈されることです。 たとえば、bashposixモードで実行されるスクリプトを書きたいとします。シバンを書く簡単な方法は次のとおりです。 #!/usr/bin/env bash --posix ただし、結果のスクリプトを実行しようとすると、次のエラーが生成されます。 /usr/bin/env: ‘bash --posix’: No such file or directory 私はこの投稿を知っていますが、より一般的でクリーンなソリューションがあるかどうか疑問に思っていました。 編集:Guileスクリプトには、マニュアルのセクション4.3.4に記載されている、目的を達成する方法があることを知っています。 #!/usr/bin/env sh exec guile -l fact -e '(@ (fac) main)' -s "$0" "$@" !# ここでのトリックは、2番目の行(で始まるexec)がコードとして解釈されますshが、#!... !#ブロック内にあるため、コメントとして解釈されるため、Guileインタープリターによって無視されることです。 このメソッドをインタープリターに一般化することはできませんか? 2番目の編集:少し遊んだ後、から入力を読み取ることができるインタープリターのstdin場合、次のメソッドが機能するようです: #!/usr/bin/env sh sed '1,2d' "$0" | bash --verbose --posix /dev/stdin; exit; ただし、sh通訳が仕事を終えるまでプロセスは存続するため、おそらく最適ではありません。フィードバックや提案をいただければ幸いです。

1
シバン後のサイン?
Apacheのhttpdプロジェクトの「サポート/ apxs.in」スクリプトで囲まれたテキストの@兆候が後に来ます#!。つまり、スクリプトの最初の行は次のとおりです。 #!@perlbin@ -w これはPerlのものですか、それともUNIXカーネルのものですか?つまり、path/to/script/script_name.in?を使用してこのスクリプトを実行することが可能です。 そうでない場合、スクリプトを開始する理由は何#!ですか?

3
画面でスクリプトを実行する
切り離された画面でbashスクリプトを実行したい。スクリプトはプログラムを数回呼び出しますが、各プログラムは待機に時間がかかりすぎます。私の最初の考えは、単に画面を開いてからスクリプトを呼び出すことでしたがctrl-a d、スクリプトの実行中に(byで)切り離すことはできないようです。それで、私はいくつかの調査を行い、シバンを次のように置き換えるこの指示を見つけました: #!/usr/bin/screen -d -m -S screenName /bin/bash しかし、それも機能しません(オプションは認識されません)。助言がありますか? PS screen -dmS name ./script.shたぶん、私の目的にはおそらく役立つと思いますが、これをスクリプトに組み込む方法についてはまだ興味があります。ありがとうございました。

5
bashスクリプトの代わりにzshを使用することをお勧めしますか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 5日前に閉鎖されました。 zshスクリプトを実行するのに十分な人がインストールされていると仮定できますか? #!/usr/bin/env zsh シバンとして? または、これにより、スクリプトが非常に多くのシステムで実行できなくなりますか? 明確化:エンドユーザーが実行したいプログラム/スクリプトに興味があります(Ubuntu、Debian、SUSE、Arch&cなど)。

3
パスレスシバンを使用してみませんか?
インタプリタへのパスを指定する代わりに、インタプリタの名前があり、シェルが$ PATHを介してそれを見つけられるようにするシェバンを持つことは可能ですか? そうでない場合、理由はありますか?
24 shell  shebang 

4
なぜ.bashrc / .bash_profileにシバンがないのですか?
簡単な問い合わせ:スクリプトの上にシバンを見たことがないことに気付いた.bashrcので、ログイン時にシステムがデフォルトのシェルを使用してソースを取得すると考えるようになります(${SHELL})。それがなぜなのか、つまり、ログインスクリプトを実行するためにデフォルトのシェル以外のものを使用するのは悪い習慣であると考えられるのか、私は理由を熟考しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.