echo $GOPATH
irá imprimir:
/mnt/star/program/go/package:/mnt/star/git_repository/workspace/go_workplace
Existem 2 diretórios, quero anexar o subdiretório do primeiro diretório bin/
ao $PATH
.
Se eu escrever $PATH=$PATH:$GOPATH/bin
, na verdade ele anexa 2 diretórios a $PATH
:
/mnt/star/program/go/package
Isso contém apenas diretórios, deve ser/mnt/star/program/go/package/bin
./mnt/star/git_repository/workspace/go_workplace/bin
Isso realmente não deve ser adicionado ao$PATH
.
BTW, há casos que $GOPATH
contém apenas um diretório, de modo que simplesmente anexar $GOPATH/bin
funcionará.
Estou procurando uma solução que se encaixe nos dois casos. Então, como eu escrevo isso em um arquivo de configuração do bash?
Você pode usar:
Ou
Ambos funcionarão porque pode haver no máximo um
:
.Ele irá remover a peça depois
:
. Portanto, no seu primeiro caso, ele removerá o segundo diretório e, no segundo caso, não haverá padrão como:*
, portanto, não haverá alteração no nome do diretório.O asterisco é um glob, não uma expressão regular. Dois sinais de porcentagem significam remover o máximo que pode corresponder da parte de trás, portanto, mesmo que houvesse três ou mais diretórios, você obteria apenas o primeiro.
Se não houver nada para remover, ele não remove nada, então você obtém o único caminho se houver apenas um.
Aqui está uma resposta alternativa usando arrays; infelizmente, isso requer duas etapas para atribuir à resposta, mas eu a menciono de qualquer maneira, pois é mais geral e potencialmente mais versátil do que as outras respostas:
A vantagem dessa abordagem é que você pode especificar facilmente qualquer componente do
GOPATH
, não apenas o primeiro. Ou, para anexar todos os elementos, seguidos de/bin
, aPATH
:Em ambos os casos (dividir, unir) definimos o separador de campo interno (
IFS
) para o caractere de dois pontos:
. A substituição é${var/%//bin}
anexada/bin
ao final de uma variável escolhida.Dito isso, se você quiser anexar todos os
GOPATH
componentes, com o sufixo/bin
,PATH
o seguinte seria mais simples e não requer matrizes. No entanto, requer queGOPATH
não esteja vazio:(
${var//pattern/subst}
substitui todas as ocorrências depattern
comsubst
, enquanto${var/pattern/subst}
, usado acima, substitui apenas a primeira.)