zshでPATH変数を変更する

zshでPATH変数を変更する

zshでPATH変数を変更したいです。

.zshrc問題:ファイルのどの部分を変更する必要があるのか​​わかりません。

通常、私はPATH変数の割り当てを見つけ、最初から希望の値を設定します(すべてのシステムバイナリディレクトリは変更されていません)。

私の.zshrcファイルの最初の行は次のようになります。

# If you come from bash you might have to change your $PATH.
# export PATH=$HOME/bin:/usr/local/bin:$PATH

# Path to your oh-my-zsh installation.
export ZSH="/Users/Sam/oh-my-zsh"

export PATH=$PATH:/Applications/Postgres.app/Contents/Versions/13/bin

など。

私の実際のPATH変数は次のとおりです。

/Library/Frameworks/Python.framework/Versions/3.9/bin:/Library/Frameworks/Python.framework/Versions/3.8/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/Postgres.app/Contents/Versions/13/bin

python3.8のあるディレクトリを削除したいです。重複しています。

私の質問:

  1. .zshrcファイルで行2または7を変更する必要がありますか?
  2. 2行目はコメントアウトされています。端末の起動時に実行されますか?
  3. 7行をコメントアウトしてみました。しかし、postgresディレクトリはまだ私のPATH変数に残りますが、これは理解できません。

ベストアンサー1

コメントから回答として再投稿しましたが、追加のメモがいくつかあります。

まず、WebでUn * xシェル(コマンドライン)とターミナルセッションの使用に関する紹介ガイドを検索してください。ほとんどは、PATHなどの最も一般的な環境変数に関する広範な情報を提供します。 (一部の人は詳細を提供していない可能性があります。多くの場所ただし、PATH変数は設定/変更/等です。 )

第二に、環境変数インスタンスごとこれにより、各プロセスの開始時に(親プロセスから)独自の変数コピーが得られます。「グローバル環境」というものはありません。 2つの端末インスタンスを開き、1つの端末にを入力し、export PATH=""PATH変数を消去して別の端末に入力すると、これを確認できますecho $PATH。 2 番目に PATH 変数が表示されます。影響を受けなかった最初の端末ウィンドウでクリーンアップを続行します。

第三に、質問がすべてでない限り、1つの質問に複数の質問をしないようにしてください。非常に密接に関連。

私は質問の間を前後に移動します(これらの質問は非常に密接に関連しているためです)。また、bash構文/コマンドを多く使用します。他のシェルは異なる形式(たとえば)を使用できsetvarますtcsh

あなたの基本 .zshrcユーザーホームディレクトリ($ HOME)を作成するときは、スケルトン(テンプレート)ファイルからコピーします(通常はユーザーレコードを作成するとき)。システム管理者がskelファイルを変更すると、新しいバージョンがいいえすでに存在するホームディレクトリにコピーしてください! )。これらのスケルトンファイルは通常、/etc/skel次の場所にあります。可能特定のシェルに対して定義されるか、システム管理者によって定義されます。

これらのデフォルト/フレームワークファイルには一般的に一般的な使い方の例が含まれており、時にはコメントアウトされて(「#」プレフィックス)、ユーザーのホームディレクトリで編集するときに、必要に応じてコメントを削除または編集できます。

これらのファイルがすべて自動的にロードされるわけではありません。 「ログイン」時にのみロードされます。一部はGUIを介してログインしたときにのみロードでき、他の一部はテキストモードコンソールにログインしたときにのみロードできます。通常、他のシェルはそのシェルにログイン/起動するときにデフォルト設定を定義するために.<shell>rc.bashrcまたは(通常は「rcファイル」に短縮されている)などの名前を使用します。.zshrcこれが何を意味するのか特に注意してください。どのシェルやそのrcファイルをロードしないcronジョブやGUIランチャーなどのプログラムでプロセスを実行している場合は、rcファイルに設定されているコマンドや変数を使用できません。

また、シェルが実行することに注意してください。いいえ自動的にリフレッシュrcファイルを編集するたびに。編集後に「再ロード」するには、シェル/ターミナルを閉じる/終了し、再度ログインする必要がありますsource .zshrcsource .bashrc一部のシェルは強制的にセッションを再ロードできます。これを行う方法の詳細については、シェルのマニュアルページを読んでください。

この方法を使用するときは、以前のsource .zshrc設定と値が維持されることも覚えておく必要があります。これには、rcファイルがPATH変数を明示的に消去しない限り、古い値が含まれます。次へ追加rcファイル - 以前にロードされたrcファイルが追加された場合も同様です。たとえば、「growvar.sh」というファイルに次のコードを入力します。

export GROWVAR="$GROWVAR:Grow!"
echo "GROWVAR now contains \"$GROWVAR\""

そして保存してください。次に、次のコマンドと結果をメモします。

$ source growvar.sh
GROWVAR now contains ":Grow!"
$ source growvar.sh
GROWVAR now contains ":Grow!:Grow!"
$ source growvar.sh
GROWVAR now contains ":Grow!:Grow!:Grow!"

(また、これを行う必要がありますsource。ファイルを実行可能にすること(chmod +x ...)は、親シェルプロセス環境に影響を与えず、サブシェルで「実行」されるため、期待どおりに機能しません。)

ほとんどのシェルはすでに検査された$PATHのすべての部分検査をスキップするため、通常PATHには無害です。また、「::」などの「空の」パスも無視します(実際にはサム":"で区切られた空のパス。これが $PATH が以前に設定されていなくても、 `export PATH="$PATH:/new/path/here" がまだ機能する理由です。しかし、PATH変数に長いパスを追加すると、複数の冗長パスが原因で変数が非常に大きくなる可能性があります。 (使用可能な環境空間メモリがなくなる可能性があります。)

何か忘れているのは確かです...しかし、これがつながる方法です。

質問#1:ライン#7を変更してください。または...コメントを付けて「修正済み」バージョンを追加します。これにより、変更した内容、前の内容、後の内容を後ですぐに確認できます。スケルトンファイルのコメント付き「例」コードについても同じことを行います。コメントを削除しないでください。コードをコピーして必要に応じて調整し、コピーのコメントを外します。

問題#2:上記のように、「#」はその行をコメント行にし、シェルはこれを無視します。

Q3:おそらくrcファイルを変更すると、自動的にファイルが再ロードされると予想されます(上記ではそうしないと説明しました)。または(コマンドを介してsource)再ロードすると、PATHは将来〜になります明らか現在の価値(上記でも説明しましたが本当ではありません)。変更を適用するには、シェルを完全に再起動または再ロードする必要があります。

質問(コメントから)#1:「$ PATHはどこから入手できますか?」最初はPATHが存在しませんでした。 $PATHのようにこれを参照しようとすると、空の文字列( "")のみが返されます。シェルにログインすると、シェルは通常、後で使用できるようにsourcePATH 変数を設定する複数のシステム基本ファイルを自動的に生成します/etc/default(他の場所の中で、シェルのマニュアルページにシェルの詳細が表示されます).だから最大例PATH設定を使用して、以前export PATH="$PATH:/new/path/here"に設定されたパスを維持します(またはPATHが以前に存在しなかった場合はまったく保持しません)。

質問(コメントから) #2: "$HOME/bin" に関するサンプルライン: 経験豊富な多くの Un*x ユーザーは自分のログインに固有のカスタムコマンドとオーバーライドを提供するために独自の $HOME/bin ディレクトリを持っています。したがって、構成例の例では、ディレクトリをPATHに追加してこれを示します。存在しないPATH変数のすべてのディレクトリは無視され、エラーなしでスキップされます。

追加するように編集された:ああ、そして... $ HOMEが定義されていない極端な場合は、PATHなどの空の文字列に置き換えられます。したがって、「$HOME/bin」は「/bin」と評価されます。

別の「追加のための編集」機能が役に立ちます。単にPATHをクリーンアップすることが目標である場合は、これを行うための簡単なユーティリティを作成できます。ただし、このユーティリティは独自のPATHコピーのみを変更できることに注意してください。新しいパスを設定するには、親プロセス/シェルで読み取ることができる削除されたパスをユーティリティ出力(標準出力)に設定することでこの問題を解決できます。たとえば、

...
export PATH=`/bin/mypathutil --cleanup`
...

/bin/cleanpath実際には、各ディレクトリが一度だけ提供されるパスを出力するTCLスクリプトがあります。したがって、 "/bin:/bin:/usr/bin:/bin:/usr/bin:/usr/games:/bin:/bin" のようなコマンドは単に "/bin:/usr/bin: usr/games"を出力します。 。 (技術的には、私のスクリプトはそれ以上の機能を実行します。たとえば、私の特別なカスタムディレクトリが/usr/local/overrides常にPATHの最初にあるようにして、常にそこからカスタムコマンドを無視できるようにします。シンボリックリンクを作成して特定のコマンドを一時的に無効にすることもできます。/overrideは/bin/true.

おすすめ記事