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しかし、ディレクトリが1つしか含まれていない場合もありますので、追加してください$GOPATH/bin

両方のシナリオに合ったソリューションを探しています。それでは、これをbash設定ファイルにどのように書きますか?

答え1

あなたはそれを使用することができます:

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

または

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

最大1つしか存在できないため、両方が機能します:

それ以降の部分は削除されます:。したがって、最初のケースでは2番目のディレクトリが削除され、2番目の場合は同様のパターンがないため、:*ディレクトリ名は変更されません。

答え2

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

アスタリスクは正規表現ではなくグローバル変数です。 2%の記号は、一致する最大値を後ろから削除することを意味するため、3つ以上のディレクトリがあっても最初のディレクトリのみがインポートされます。

削除するものがなければ何も削除されないため、パスが1つしかない場合はそのパスだけが得られます。

答え3

以下は配列を使用した代替答えです。残念ながら、回答を割り当てるには2つのステップが必要ですが、他の回答よりも一般的で一般的である可能性があるため、言及します。

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

このアプローチの利点は、GOPATH最初のコンポーネントだけでなく、すべてのコンポーネントを簡単に指定できることです。または追加みんな要素の後に/binPATH

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

どちらの場合も(分割、マージ)、内部フィールド区切り文字(IFS)をコロン文字に設定します:。代替項目は選択した変数の末尾に${var/%//bin}追加されます。/bin

つまり、追加したい場合みんな GOPATHコンポーネントに接尾辞を付けると、/binPATHは簡単になり、配列は必要ありません。しかし、GOPATH空である必要はありません。

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

${var//pattern/subst}変えるみんなpattern上記で使用したsubstwithとwhileは、${var/pattern/subst}最初の項目のみを置き換えます。 )

関連情報