シェルスクリプトのPATHから最初または複数のセグメントを削除する方法

シェルスクリプトのPATHから最初または複数のセグメントを削除する方法

shスクリプトを介してPATHからCUDAディレクトリを削除したいと思います。ディレクトリは次のように表示されます。echo $PATH

/usr/local/cuda-9.0/bin:/usr/sbin:/usr/bin:

私はただ次が欲しい:

/usr/sbin:/usr/bin:

私のスクリプトは何も変更しませんでしたが、端末では変更されました(これを行うとスクリプトは自動的に実行されますconda deactivate)。

export PATH=$(echo ${PATH} | sed -r 's|/usr/local/cuda-9.0/bin||')

誰かが私に理由を伝え、エレガントに修正できますか?

答え1

export PATH=$(echo ${PATH} | sed -r 's|/usr/local/cuda-9.0/bin||')

または、より正確なバージョンは次のとおりです。

export PATH="$(printf '%s\n' "$PATH" | sed 's|/usr/local/cuda-9\.0/bin||')"

$PATH最初のエントリを削除して、コマンドを呼び出したシェルの変数の内容を更新します/usr/local/cuda-9.0/bin。たとえば、aを望ましくないものに/bin:/opt/usr/local/cuda-9.0/bin/v2:/usr/local/cuda-9.0/bin変更します。/bin:/opt/v2:/usr/local/cuda-9.0/bin

要素全体を削除するには、次のようにします。

export PATH="$(
  printf ':%s:\n' "$PATH" |
    sed '
      :1
      s|:/usr/local/cuda-9\.0/bin:|:|g; t1
      s|^:||; s|:$|'
)"

またはzshを使用してください。

path=("${path[@]:#/usr/local/cuda-9.0/bin}")

$PATH最初にのみ含めると、/usr/local/cuda-9.0/bin最終結果は空になります$PATH。そして空の$PATH意味現在のディレクトリから実行可能ファイルを検索するあなたが望むものではありませんか?これが可能な場合は、$PATH同様のものを作成したいかもしれません/inexistent/to/disable/PATH/lookup

何があっても、$PATHコードを実行するシェルの変数のみが変更されることに注意してください。$PATHスクリプトを呼び出すシェルの変数に影響を与えるには、対応するシェルが必要です源泉(同じ.またはsourceコマンド)このスクリプトをdeactivate作成するか、deactivate機能その皮。

またはdeactivateスクリプトを使用することができます出力これらのエントリを削除するために必要なシェルコードを削除し$PATH(例:export -p PATH修正後に追加)、次のように呼び出されることを確認してください。

eval "$(deactivate)"

アイテムを削除するシェルから$PATH

それは次のとおりです。

#! /bin/zsh -
path=("${path[@]:#/usr/local/cuda-9.0/bin}")
export -p PATH

答え2

あなたは簡単にすることができますexport PATH=/usr/sbin:/usr/bin。しかし、あなたの方法はすでに動作しています。

$ PATH=/usr/local/cuda-9.0/bin:/usr/sbin:/usr/bin:
$ export PATH=$(echo ${PATH} | sed -r 's|/usr/local/cuda-9.0/bin||')
$ echo $PATH
:/usr/sbin:/usr/bin:

PATH現在の環境で設定を試してください。走るスクリプトができません。

関連情報