1. ホーム
  2. shell

[解決済み] usr/bin/envはどのような効果があるのでしょうか?

2022-02-18 10:47:21

質問

とはどう違うのですか? #! /usr/bin/env ruby#! ruby ?

(の違いについて議論している他の多くの質問を見つけました。 #! /usr/bin/env ruby#! /usr/bin/ruby が、それは私の質問ではありません)。

どのように解決するのですか?

#! ruby

...は、UNIX系システムでの動作は保証されていません(そして はしません。 は全く動作しません。有効なシバングには 完全修飾された のパスが必要です。エディタにどのプログラミング言語を使っているかを伝えるには十分かもしれませんが、カーネルがそれを使ってプログラムを実行するインタープリタをうまく選択できるわけではありません。

カーネルの execve のような C 標準ライブラリのラッパーによって追加されます。 execlpexecvp しかし、シェバングの解析はカーネルが直接行うので、Cライブラリの優劣はそこで発生しません。


#!/usr/bin/env ruby

...は、PATH を使って ruby を実行します。なぜなら env 実行ファイルが完全に指定されているので、これは有効なシバング行です(どの #! ruby はありません)。


env は他の目的もあります。例えば、走ることができます。 env -i someprog を実行するために someprog を完全に空の環境で使用するか env FOO=bar someprog を実行します。 someprog を環境変数 FOO という値に設定します。 bar (どの FOO=bar someprog はシェルを介して実行された場合にも行われますが env のアプローチは、シェルを介さない場合にも機能します)。

しかし、この文脈で関連するユースケースは、PATHルックアップを強制することです。