web-dev-qa-db-ja.com

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

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

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

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

読みにくいです。

複数行の構文を使用してPATH変数へのdefineまたはaddパスへのパスはありますか?おそらく配列を使用していますか?私はこのようなものを探しています:

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

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

16

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"

二重引用符は、$PATH$IFS${new_path[*]}および$OLD_IFSを囲む重要な変数であり、変数にスペースを保持し、シェルがIFSを解釈しないようにします。

pdate2コメント付き、sedを使用した空行管理:

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実装に固有の場合があるため、タブをテストする必要があります)。

12
jfg956

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

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

Zshでは、$pathは配列です:

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

注:両方のpathは小文字です。

12
Kabie

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

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

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

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

_path+=(/path/to/app/{i386,share}/bin(-/N))
_