0

このコードの操作

Bashで$PATH変数からパスを削除する最もエレガントな方法は何ですか?

export PATH=`echo ${PATH} | awk -v RS=: -v ORS=: '/SDE/ {next} {print}'` | sed 's/:*$//'

この場合、次のものだけを実行すると:

export PATH=`echo ${PATH} | awk -v RS=: -v ORS=: '/SDE/ {next} {print}'`

/SDE/削除されたパスを取得できます。しかし、:残っています。sed私が想定している後のコマンドは、それを削除する必要があります。このコマンド全体を一度に実行すると、何も削除されません。sedパスが更新されない原因となっているステートメントの何が問題なのか、パス変数が削除された後にsedコマンドでコロンを削除するにはどうすればよいですか。:/SDE/

4

3 に答える 3

2

`問題は、コマンド内の終了バッククォートの配置です。

export PATH=`echo ${PATH} | awk -v RS=: -v ORS=: '/SDE/ {next} {print}'` | sed 's/:*$//'

推奨される$(...)表記法を使用した場合、これは次と同等であることがわかります。

export PATH=$(echo ${PATH} | awk -v RS=: -v ORS=: '/SDE/ {next} {print}') | sed 's/:*$//'

export操作の出力を にパイプしますが、sedサイレントexportです。

使用する:

export PATH=$(echo ${PATH} | awk -v RS=: -v ORS=: '/SDE/ {next} {print}' | sed 's/:*$//')

誤ったコマンドがそのままコピーされた回答を修正しました。Tripleeeがコメントで指摘しているように、私はawk解決策に完全に納得しているわけではありませんが、質問は「コードの何が問題だったのか」であり、答えは「逆引用符が配置されている場所」です。awkスクリプトは、PATH 内の任意の位置にある PATH の要素の削除を処理します。スクリプトは、PATH の末尾にある現在のディレクトリが暗黙的に使用されないように、sed末尾がないことを確認するだけです。:

参照:シェル スクリプトでPATH 要素を操作する方法と、PATH 変数を複製しないようにする方法clnpathのスクリプト— スクリプトは、質問の主題にもかかわらず、Bourne、Korn、Bash シェルなどの POSIX シェル用です。ここで使用されている と の表記の違いの 1 つは、フル パス名のみを削除することです。部分的なパス要素の一致を試みません。cshclnpathclnpath

export PATH=$(clnpath $PATH /opt/SDE/bin)

削除するパス要素が だった場合/opt/SDE/bin。、、およびその他のパスのような変数clnpathを維持するために使用できることに注意してください。もちろん、呼び出しもできます。LD_LIBRARY_PATHCDPATHMANPATHawk

/SDE/ちなみに、スクリプトのパターンawkが削除されることに注意してください/opt/USDER/bin。正規表現のスラッシュは、パス名のスラッシュとは何の関係もありません。

于 2013-01-02T15:34:24.250 に答える
0

ただbashで:

tmp=":$PATH"
[[ $tmp =~ :[^:]*/SDE/[^:]* ]] && tmp=${tmp/${BASH_REMATCH[0]}/}
PATH=${tmp#:}
于 2013-01-02T17:27:46.050 に答える
0
$ PATH="$( awk -v rmv="/SDE/" -v path="$PATH" 'BEGIN{sub(rmv,"",path); gsub(/:+/,":",path); print path}' )"

サンプル入力または期待される出力を提供しなかったため、上記は推測であるため、必要なものとは異なる場合がありますが、正しいアプローチです。

于 2013-01-02T17:01:14.130 に答える