特定のライブラリがVPSにインストールされていることをテストし、そうでない場合は、スクリプトがそのライブラリをインストールするために必要なbashスクリプトを作成しています。
私の問題は、スクリプトが存在するかどうかを確認できることです。私の主なアイデアはこれを使用することです。
ldd /usr/lib/libgd.so > /tmp/lddcheck 2>/dev/null
ldd結果をファイルに出力し、grepなどを使用して、私が探しているライブラリを検索できます。存在しない場合はインストールし、そうでない場合はスクリプトが続行されます。
正確に何をすべきかわかりません。どんな助けにも感謝します(bashスクリプトにはかなり新機能です)。
答え1
あなたを見ると〜する一種のパッケージマネージャを使用してライブラリをインストールし、必要なパッケージのリストだけを作成する方が簡単ではないでしょうか。考えるインストールして何とかインストールしたことを確認するには?
私が知っている限り、パッケージマネージャの100%には、パッケージがインストールされていない場合はインストールされ、インストールされているが古い場合は最新バージョンに更新し、すでにインストールされている場合は最新バージョンに更新するいくつかのモード(通常はデフォルト)があります。最新の場合は直接配信されます。
たとえば、パッケージ、、がインストールされていることをapt-get
常に確認できます。など。apt-get install a b c d ...
a
b
c
d
yum
yum install a b c d
VPSがさまざまなパッケージマネージャでさまざまなシステムを使用している場合は、どのパッケージマネージャを使用しているかを検出するロジックを作成するため、この手順は不可避です。
答え2
提案されているようにlddコマンドを実行した後、次のコマンドを試すことができます。
grep "not found" /tmp/lddcheck | awk '// { print $1 }'
見つからないライブラリの名前を取得します。
答え3
必要なライブラリがそれをサポートしていると仮定すると、それを使用する必要があります。pkg-config
それがまさにその目的です。
$ pkg-config --exists libnotify
$ echo $?
0
$ pkg-config --exists nonexistant
$ echo $?
1
$
これを使用してバージョンを確認し、インクルードやライブラリパスなどを通知できます。
答え4
スクリプトを初めて使用する場合は、次の点に注意してください。一時ファイルはほとんど必要なく、一時ファイルもほとんど必要ありません。複数のステップで一部のデータを処理する必要がある場合は、パイプラインを使用してください。出力にはさまざまなテキスト処理ツールを使用できますldd
。ここでは、を使用して(ライブラリパスの代わりに)awk
3番目のスペースで区切られたフィールドを含む行を検出し、最初のフィールド(ライブラリ名)を印刷します。not
欠落しているライブラリのスペースで区切られたリストを含む変数として出力を収集しました。
missing=$(ldd /path/to/executable | awk '$3 == "not" {print $1}')
for x in $missing; do
# whatever it takes to install $x
done
これは正しいアプローチではないかもしれません。特定のディストリビューションをサポートするには、パッケージマネージャとのカスタムインタラクションを含む汎用バイナリパッケージを作成しないでください。このディストリビューションのパッケージをデプロイします。
パッケージマネージャはシステム管理者の仕事をより簡単にします。パッケージマネージャを正しく使用できない場合、ユーザーは混乱を感じ、怒りを引き起こす可能性があります。 rpmやdebなどを配布する場合、ユーザーはパッケージの依存関係をインストールするだけです。これにより、一部の危険なスクリプトを実行するのではなく、ユーザーに慣れているパッケージ管理ツールを使用してパッケージを記録、インストール、アップグレード、および削除できます。