4

パッケージを終了/アンロードするときにLD_LIBRARY_PATH、特定のパスを削除して以前の設定に戻す必要があります。tcsh または csh でそれを行う方法は?

edit1を明確にします。

LD_LIBRARY_PATHのようなもので、[変数 end edit2 に格納されているedit2を開始する] をどこかに含める必要があることを除いて、(私のスクリプトでは) 何も知りpath1:mypath:path2:path3:path4ません。次に、操作後にを削除したいと思います。mypath$MY_PATHmypathLD_LIBRARY_PATHpath1:path2:path3:path4

4

2 に答える 2

4

私は bash ユーザーですが、これでうまくいくと確信しています。ほとんどの場合、::in$LD_LIBRARY_PATHのままになりますが、それで問題が発生することはありません。

setenv LD_LIBRARY_PATH `echo $LD_LIBRARY_PATH | perl -pe "s[$DIR_TO_REMOVE][]g;"`

これに遭遇する可能性のある bash ユーザーの場合は、次のコマンドを使用します。

LD_LIBRARY_PATH=$(echo $LD_LIBRARY_PATH | perl -pe "s[$DIR_TO_REMOVE][]g;")
export LD_LIBRARY_PATH
于 2012-06-20T13:47:39.977 に答える
2

これをロバートの回答にコメントとして追加したはずですが、評判は50ではありません。まだ。(ヒント:あなたはそれを修正するのを手伝うことができます! ;-)

私はcshユーザーです(選択ではありません)ので、ロバートの答えは大歓迎です。ただし、使用される正規表現は、部分的なパス要素と一致する可能性があります。たとえば、 if LD_LIBRARY_PATH = path1:mypath:path2:path3:path4、 then ...

setenv LD_LIBRARY_PATH `echo $LD_LIBRARY_PATH | perl -pe "s[/ath][]g;"`

... 降伏しますLD_LIBRARY_PATH = p1:my:p2:p3:p4

ロバートの答えに基づいて、パス文字列内の完全な要素のみに一致するように正規表現を変更し、パスの先頭、中間、または末尾で発生する DIR_TO_REMOVE のケースを処理するために複数の置換を入れました。また、先頭のコロン (またはパスが ":" のみ) と二重コロン ("::") をクリーンアップするための置換も追加しました。末尾のコロンを安全に削除する方法がわかりませんでした。これは、csh パーサーが$EOF (またはこの場合は文字列の末尾) のメタ文字として処理するのが面倒だからです。( http://www.grymoire.com/Unix/CshTop10.txtを参照 )

PATH、LD_LIBRARY_PATHなどで使用したかったので、コマンドライン引数を受け入れるcshエイリアスとしてこれを実装しました。最初のパラメーターは、変更するパス変数の名前です。2 番目のパラメーターは置換するパス要素で、3 番目のパラメーターは新しいパス要素です (または、2 番目のパラメーターに一致するパス要素を単純に削除する場合は "")。

ウォルターの質問はパスを削除する方法だったことは知っていますが、削除は実際には null 値に置き換えるだけなので、これでも質問に答えます。私自身の使用のために、さまざまなツール チェーン (GCC 4.1.2、GCC 4.8.1、ICPC 2013 など) がインストールされており、適切なバイナリ、ライブラリ、および特定のインクルードへのパスを簡単にスワップイン/スワップアウトする必要がありました。ビルド管理システムに対して透明性を維持します。

コードは次のとおりです。

alias repath 'setenv \!:1 `echo $\!:1\: | perl -pe "s[^\!:2\:][\!:3\:]g; s[\:\!:2\:][\:\!:3\:]g; s[\:\:][\:]g; s[^\:][]g;"` '

次のように、csh ターミナル セッションで安全にテストします。

setenv myTestPath /myLDpath
setenv myTestPath2 /myLDpath/x86_64
setenv myTestPath3 /myLDpathDebug

setenv testPATH /SOME/PATH:/SOME/OTHER/PATH:${myTestPath}:${myTestPath2}:${myTestPath3}
echo "        Starting with the following path-variable content ..."
printenv testPATH
echo "        Remove $myTestPath from the middle ..."
repath testPATH $myTestPath ""
printenv testPATH
echo "        Put $myTestPath at the beginning ..."
setenv testPATH ${myTestPath}:/SOME/PATH:/SOME/OTHER/PATH:${myTestPath2}:${myTestPath3}
printenv testPATH
echo "        and remove it from the beginning ..."
repath testPATH $myTestPath ""
printenv testPATH
echo "        Put $myTestPath at the end ..."
setenv testPATH /SOME/PATH:/SOME/OTHER/PATH:${myTestPath3}:${myTestPath2}:${myTestPath}
printenv testPATH
echo "        and remove it from the end ..."
repath testPATH $myTestPath ""
printenv testPATH
echo "        Replace $myTestPath3 with /myLDpath/Debug ..."
repath testPATH $myTestPath3 "/myLDpath/Debug"
printenv testPATH
echo "        Done!"
于 2013-07-31T22:23:22.037 に答える