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
最初のコンポーネントだけでなく、すべてのコンポーネントを簡単に指定できることです。または追加みんな要素の後に/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}
最初の項目のみを置き換えます。 )