0

申し訳ありませんが、これはさまざまな方法で多くの質問が寄せられているようですが、なぜこれが機能しないのかを理解するのに役立ったものはありません。

私が以下を実行した場合:

sed -i".bak" "s:$PRELOADER_BASH::" ~/.bashrc

ターミナルでは動作します。ただし、shスクリプトの一部として実行したいのですが、これを実行すると、次のエラーが発生します。

sed: -e expression #1, char 8: unterminated `s' command

なぜこれをしているのか誰かに説明してもらえますか?

環境変数PRELOADER_BASHは次のとおりです。

export LD_PRELOAD=/usr/lib/mylib1.so /usr/lib/mylib2.so

スペースとスラッシュは私に初期の問題を引き起こしました。

4

2 に答える 2

0

あなたの変数 PRELOADER_BASH はシェルスクリプトに認識されていますか? サブシェル (シェルスクリプトなど) でアクセスするには、エクスポートする必要があります。

次のように変数を定義します。

export PRELOADER_BASH="export LD_PRELOAD=/usr/lib/mylib1.so /usr/lib/mylib2.so"

次に、シェル スクリプトを実行すると、機能します。export LD_PRELOAD=/usr/lib/mylib1.so /usr/lib/mylib2.so~/.bashrc ファイル内のすべての出現箇所を何も置き換えません (つまり、削除します)。

説明

コマンドラインで、おそらく次のように変数を定義したでしょう。

PRELOADER_BASH="export LD_PRELOAD=/usr/lib/mylib1.so /usr/lib/mylib2.so"

これにより、現在のシェルで使用できるようになりますが、サブ シェルでは使用できません。したがって、使用する必要がありますexport

エクスポートする代わりに、シェル スクリプトで変数を定義することもできます。

于 2013-01-16T12:57:53.993 に答える
0

わかりましたので、ここに正確なスクリプトコードを投稿しなかったので、私は少し慎重でばかげていたことがわかりました.bashファイルのライフサイクルの早い段階で、スペースと/の問題を解決しようとしたときに、次のようにPRELOADER_BASHをエクスポートしていました.仕方:

PRELOADER_BASH='export LD_PRELOAD="/usr/lib/libopenvg.so /usr/lib/libinterposer.so"'

これが実際にエラーの原因です。最善の方法は、次のことを行うことでした。

PRELOADER_BASH="export LD_PRELOAD=/usr/lib/libopenvg.so /usr/lib/libinterposer.so"

私の「やり過ぎた」プリローダーbash設定では、おそらく直接展開していたので、後から考えると本当にばかげています:

sed -i".bak" "s:'export LD_PRELOAD="/usr/lib/libopenvg.so /usr/lib/libinterposer.so"'::" ~/.bashrc

したがって、sed コマンドには実際に「終了していない `s' コマンド」が含まれていることになります。

sed -i".bak" " s:'export LD_PRELOAD="/usr/lib/libopenvg.so /usr/lib/libinterposer.so " '::" ~/.bashrc

これに人々の時間を無駄にして申し訳ありません、明らかに私はコーヒーが必要です!

于 2013-01-16T18:00:37.613 に答える