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
위에서 사용된 subst
with 및 while은 ${var/pattern/subst}
첫 번째 항목만 대체합니다. )