スクリプトを実行するときにLD_PRELOAD
を使用してライブラリを事前にロードすると、実際にはスクリプトにシボンの行がある場合にのみライブラリがプリロードされます。たとえば、このスクリプトを与えられた:なぜシェパンのないスクリプトでLD_PRELOADが有効にならないのですか?
# Not a shebang
echo Hello
と、このコマンド:
LD_PRELOAD=/path/to/preload_me.so ./script.sh
スクリプトは、私はその初期の(非)効果を経由して監視することができ、すべてのロードされているライブラリ、なしで実行コード。
一方、私はシェバング行追加した場合:
#!/bin/sh
echo Hello
を...そしてライブラリは、私が同じコマンドを経由してスクリプトを実行したときにロードされです。正確にどの通訳が指定されているかは重要ではないようです。確かに私は/bin/bash
または私が試した他のsh
- ファミリーシェルを使用することもできます。
なぜ違いがあり、コマンドに関係なく、指定されたシェルの単純なコマンドの前に特定のライブラリがプリロードされていることを確認する方法はありますか?
(その作者これらの用語で表現された質問に抵抗しanother questionから適応。)
これは良い答えですが、私はあなたが 'bash'(とおそらく他のシェル)に当てはまることを明確にすべきだと思います。' dash'はこれをやっていないようです。 (スクリプトを実行しますが、プリロードが有効になります。)すべてのPosixは、 "シェルは最初のオペランドとして検索結果のパス名でシェルを起動させるのと同等のコマンドを実行する"としています。どちらの動作にも適用できます。 (私のシステムでのクイックテスト:zshプリロード、kshはありません。) – rici
@rici、答えは、明示的には 'bash' *が新しいシェルプロセスをexecするのではなくforkしますが、明確化。 –