GOPATH에 있는 첫 번째 디렉터리의 bin 하위 디렉터리를 PATH에 추가하는 방법은 무엇입니까?

GOPATH에 있는 첫 번째 디렉터리의 bin 하위 디렉터리를 PATH에 추가하는 방법은 무엇입니까?

echo $GOPATH다음을 인쇄합니다:

/mnt/star/program/go/package:/mnt/star/git_repository/workspace/go_workplace

2개의 디렉토리가 있고 첫 번째 디렉토리의 하위 디렉토리 bin/$PATH.

내가 쓰면 $PATH=$PATH:$GOPATH/bin실제로 다음 디렉토리에 2개의 디렉토리가 추가됩니다 $PATH.

  • /mnt/star/program/go/package
    여기에는 디렉토리만 포함됩니다 /mnt/star/program/go/package/bin.
  • /mnt/star/git_repository/workspace/go_workplace/bin
    이것은 실제로 에 추가되어서는 안 됩니다 $PATH.

$GOPATH그런데 디렉토리가 하나만 포함되는 경우도 있으니 그냥 추가하세요 $GOPATH/bin.

두 시나리오 모두에 맞는 솔루션을 찾고 있습니다. 그렇다면 이를 bash 구성 파일에 어떻게 작성합니까?

답변1

당신은 그것을 사용할 수 있습니다 :

PATH="$PATH:${GOPATH%%:*}/bin"

또는

PATH="$PATH:${GOPATH%:*}/bin"

최대 하나만 있을 수 있으므로 둘 다 작동합니다 :.

그 이후 부분은 삭제됩니다 :. 따라서 첫 번째 경우에는 두 번째 디렉터리가 삭제되고, 두 번째 경우에는 비슷한 패턴이 없으므로 :*디렉터리 이름이 변경되지 않습니다.

답변2

PATH="$PATH:${GOPATH%%:*}/bin"

별표는 정규식이 아닌 전역 변수입니다. 2% 기호는 일치할 수 있는 가장 큰 값을 뒤에서 제거한다는 의미이므로 디렉터리가 3개 이상 있어도 첫 번째 디렉터리만 가져옵니다.

삭제할 것이 없으면 아무것도 삭제되지 않으므로 경로가 하나만 있으면 해당 경로만 얻게 됩니다.

답변3

다음은 배열을 사용하는 대체 답변입니다. 불행히도 답변을 할당하려면 두 단계가 필요하지만 다른 답변보다 더 일반적이고 더 일반적일 수 있으므로 언급합니다.

IFS=: read -ra arr_gopath <<< "$GOPATH"
PATH="$PATH:${arr_gopath[0]/%//bin}"

이 접근 방식의 장점은 GOPATH첫 번째 구성 요소뿐만 아니라 모든 구성 요소를 쉽게 지정할 수 있다는 것입니다. 또는 추가모두요소 다음에 /bin, PATH:

PATH="$PATH:$(IFS=:; echo "${arr_gopath[*]/%//bin}")"

두 경우(분할, 병합) 모두 내부 필드 구분 기호( IFS)를 콜론 문자로 설정합니다 :. 대체 항목은 선택한 변수의 끝에 ${var/%//bin}추가됩니다 ./bin

즉, 추가하려는 경우모두 GOPATH구성 요소에 접미사가 붙으면 /bin다음 PATH은 더 간단해지고 배열이 필요하지 않습니다. 그러나 GOPATH비어 있을 필요는 없습니다.

PATH="$PATH:${GOPATH//://bin}/bin"

( ${var//pattern/subst}바꾸다모두pattern위에서 사용된 substwith 및 while은 ${var/pattern/subst}첫 번째 항목만 대체합니다. )

관련 정보