쉘 스크립트의 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현재 환경에서 설정을 시도해 보세요.달리기스크립팅이 불가능합니다.

관련 정보