web-dev-qa-db-ja.com

自分自身を繰り返さずに$ PATHにディレクトリを追加します

私のシェルはzshで、OSはUbuntu 13.04です

次の場所で機能するように、$ PATHにディレクトリを追加する必要があります。

  • グラフィカル環境(Unity)(起動アプリケーション、ショートカットで実行されるgmrunプログラムなど(基本的にalt + f2の「コマンドの実行」として)
  • Unityのターミナルで
  • ターミナル内 Ctrl + Alt + F1

.profileに追加しましたが、最初の2つのポイントで機能しますが、最後のポイントでは機能しません。 .zshrcに追加できることはわかっていますが、この場合は2つの場所に書き込まれ(DRYに違反します)、Unity内のターミナルの場合は$PATHに2回表示されます( 「それは非常に悪いとは思わないが、少なくともきれいではない)

.zshrcにのみ追加すると、2番目と3番目の場合にのみ機能します(明らかに)

私に何ができる?

5
RiaD

この答えは、基本的にエリア・ケイガンの答えに基づいており、私が本当にやったことを含んでいます。

~/.pam_environmentに追加しました

PATH DEFAULT=${PATH}:/home/riad/scripts

しかし、少なくとも私のPCでは、tty1では解析されませんでした(Ctrl+Alt+F1)ログインしますが、グラフィカルログインで解析されました。 (Unityで作成されたロケール設定でさえ、非グラフィカルログインでは機能しませんでした)

その理由は、lightdm(/etc/pam.d/lightdm)のPAM構成ファイルに次の行があったためです。

session required        pam_env.so readenv=1 user_readenv=1 envfile=/etc/default/locale

/etc/pam.d/loginに同じ行を追加しました

@include common-session

そして

@include common-password

注意してください!不正な.pam_environmentファイルにより、ログインが中断される場合があります。

1
RiaD

まず、.zshrcファイルで.profileを取得するだけです。

それに加えて、zshを使用しているときに、.zshrcに以下を追加できます。

typeset -U path

# If you want it at the front of your path
path=({/custom/path/bin "${path[@]}")

# If you want it at the end of your path
path+=(/custom/path/bin)

仕組み:

Zshでは、$PATH変数は$path変数にバインドされています。 $pathは配列であり、$PATH$pathの要素が:${(j|:|)path}と同じ)で結合されたスカラーです。 typeset -U pathは、path配列の要素(したがって、$PATH)を一意にします。

   typeset [ {+|-}AEFHUafghklprtuxmz ] [ -LRZi [ n ]] [ name[=value] ... ]
   typeset -T [ {+|-}Urux ] [ -LRZ [ n ]] SCALAR[=value] array [ sep ]
          Set or display attributes and values for Shell parameters.
          (...)
          -U     For  arrays  (but  not for associative arrays), keep only
                 the first occurrence of each duplicated value.  This  may
                 also  be  set for colon-separated special parameters like
                 PATH or FIGNORE, etc.  This flag has a different  meaning
                 when used with -f; see below.
1
Kevin