web-dev-qa-db-ja.com

このコマンドはターミナルでは機能しますが、シェルスクリプトでは機能しません

シェルスクリプトから実行したいコマンドがあります。

LD_PRELOAD='/usr/$LIB/libstdc++.so.6' DISPLAY=:0 Steam

このコマンドは、私のシステムでSteamを正しく実行するために必要です。このコマンドを使用せずにSteamを実行しようとすると、ランチャーにアイコンが表示されてから再び消えて、システムモニターで終了する必要があるプロセスだけが残ります。

そのコマンドを直接ターミナルにカットアンドペーストすると、完全に機能します。 Steamが開いて正常に動作し、ターミナルがバックグラウンドに座って、Steamが再び閉じられるまで出力を提供します。

シェルスクリプトからそのコマンドを実行しようとすると、機能しなくなります。同じ問題のある動作が現れます。

興味深いことに、ターミナルに移動して./Steam.shと入力すると(これはスクリプトの名前です)、Steamが正しく開きます。

Steam.shはホームフォルダーにあり、ターミナルのホームフォルダーからすべてのコマンドを実行し、Steam.shに実行権限を与えました。また、シェルスクリプトのコマンドの最後に&を追加してみましたが、効果はありませんでした。

このコマンドがシェルスクリプトから起動されたのか、ターミナルから起動されたのかによって動作が異なる理由はありますか?シェルスクリプトは、基本的にはターミナルからコマンドを実行するのと同じものだと思っていました。

2
Excrubulent

デフォルトのターミナルインタープリターはDashであるため、Bashでスクリプトを実行します。 Bashには、Dashにはない機能があります。

とにかく、次のようにSteamを修正できます:

Steamを実行する前に:

ln -sf /usr/lib/libstdc++.so.6.0.20 ~/.local/share/Steam/ubuntu12_32/Steam-runtime/i386/usr/lib/i386-linux-gnu/libstdc++.so.6

Steamを実行した後:

rm $HOME/.Steam/steam/ubuntu12_32/Steam-runtime/i386/usr/lib/i386-linux-gnu/libstdc++.so.6
rm $HOME/.Steam/steam/ubuntu12_32/Steam-runtime/AMD64/usr/lib/x86_64-linux-gnu/libstdc++.so.6