複数行の構文を使用してPATHにパスを追加する


16

私の知る限り、PATH環境変数にパスを追加する通常の方法は、:文字で区切られたパスを連結することです。

たとえば、3つのパスを追加する場合/my/path/1/my/path/2および/my/path/3、次のようにする必要があります。

PATH=$PATH:/my/path/1:/my/path/2:/my/path/3

読みにくいです。

複数行の構文を使用して変数にパスを定義または追加する方法はありますか?おそらく配列を使用していますか?私はこのようなものを探しています:PATH

PATH = 
$PATH
/my/path/1
/my/path/2
/my/path/3

シェル固有の興味深いソリューションがある場合は、zshのソリューションを探しています。

回答:


12

zshで動作するかどうかはわかりませんが、bashで動作します。

PATH=$(paste -d ":" -s << EOF 
$PATH
/my/path/1
/my/path/2
/my/path/3
EOF
)

編集してさらに短く:

PATH=`paste -d ":" -s << EOF 
$PATH
/my/path/1
/my/path/2
/my/path/3
EOF`

そして、プロセスを生成することなく:

new_path=(
"$PATH"
/my/path/1
/my/path/2
/my/path/3)
OLD_IFS="$IFS"
export IFS=":"
PATH="${new_path[*]}"
export IFS="$OLD_IFS"

二重引用符は重要なarroundのある$PATH$IFS${new_path[*]}および$OLD_IFSIFSの変数と回避シェルの解釈にスペースを維持します。

sedを使用したコメントと空行管理を含むUpdate2

PATH=`sed -e '/^#/'d -e '/^$/'d << EOF | paste -d ":" -s 
$PATH
/my/path/1
# This is a comment.
/my/path/2

/my/path/3
EOF`

コメント文字は行の最初の文字でなければならず、空の行は完全に空でなければなりません。コメントと空行の前にスペースとタブを管理するには、sed -e '/^[ \t]*#/'d -e '/^[ \t]*$/'d代わりに(sed実装に固有の可能性があるため、テストするタブ)を使用します。


zshで最後のスニペットをテストしましたが、動作します。また、他のソリューションよりも少しクリーン(行ごとに1つのパス)であることも気に入っています。ソリューションはコメント行(パス)に対応できますか?空の行はどうですか?
アメリオバスケスレイナ

コメントと空の行管理で更新します。
jfg956

また、sedを使用すると、より複雑なスクリプトで貼り付けプロセスを回避できます。
jfg956

pasteソリューションのパスにインデントを使用しても大丈夫ですか?
void.pointer

20

まったく興味深いソリューションではありませんが、非常に移植性があります。

PATH=${PATH}:/my/path/1
PATH=${PATH}:/my/path/2
PATH=${PATH}:/my/path/3

1
これは私が長年にわたって見てきたことの典型です。パスを簡単に並べ替えたり、要素をPATH = / my / path / 1:$ {PATH}に変更して、強制的に追加することもできます。
bsd

1
また+=、文字列を完全に再構築する必要を回避するために使用できます。
クリスダウン

そして、中括弧を使用する必要さえありません。コロンは環境変数名に使用できないため、解決するためのあいまいさはありません。
-Alexios

面白くないため+1。面白いことも時々ありますが、これはそんな時ではありません!(特にOPが問題として「読みにくい」と明示的に言及したため。)
ruakh

@ChrisDown文字列を再構築せずに追加する構文はありますか?
ジョンP

12

zshでは$path、配列です。

path=(
    $path
    ~/.local/bin
    ~/.gem/ruby/2.0.0/bin
)

注:両方ともpath小文字です。


それはシェルに依存し、すべてがこれを処理するわけではありません。
フォンブランド

1
@vonbrand:はい、しかしzshで動作します。言及する価値があると思います。
カビー

3
+1(この質問にはzshのタグが
付いています

OPは、具体的zshのについて尋ねられたので、これが最良の選択肢である
ダニエルSerodio

1
$ pathと$ PATHの区別について詳しく知りたい方は、この投稿を
ご覧ください-mbigras

7

zshで、パスの最後にディレクトリを追加する場合:

path+=/my/path/1
path+=/my/path/2
path+=(/path/to/app/{i386,share}/bin)

移植性:PATHにパスを正しく追加する方法は?

glob修飾子を使用して、既存のディレクトリまたはそのようなシンボリックリンクではないエントリを除外できます。これは、ディレクトリがセッション中に後で追加される可能性があるかどうかに応じて(たとえば、リモートファイルシステム上にある場合)、望ましい場合とそうでない場合があります。path+=/my/path右側は文字列コンテキストにあり、グロビングを受けないため、構文ではできません。path+=(/my/path)各配列要素はリストコンテキストで展開されるため、これを使用できます。

path+=(/path/to/app/{i386,share}/bin(-/N))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.