私は macOS を使用しており、シェルは zsh です。デフォルトでは、システムのホーム ディレクトリは です/Users/njohn
。このパスへのシンボリック リンクを作成しました。を に/usr/local/home
配置しました。これを行うと、まずホーム ディレクトリから にすばやく移動でき、すべての homebrew パッケージと構成ファイルが存在する場所に移動できます。これは非常に簡単なショートカットです。また、ファイルシステム内で私が親近感を持ちたいものから遠く離れている通常のパスではなく、シンボリック リンク パスを使用してそこに移動できることも気に入っています。HOME="/usr/local/home"
.zshrc
cd ..
/usr/local
cd
これによって何かが壊れる可能性はありますか? 同じことを達成できるより安全で良い方法はあるでしょうか?
答え1
免責事項: 私は MacOS を使ったことがないので、Mac と *nix の間にどのような不規則性や微妙な違いが存在するのか、もし存在するとしても、完全にはわかりません。
ご質問にお答えすると、この設定で「破損」が発生すると私が想像できる唯一のシナリオは、特定のプログラムがホーム ディレクトリで何かをしようとして、デフォルトでシンボリック リンクをたどらない (または何らかの理由でまったくたどらない) 場合です。架空のプログラムがホーム ディレクトリ内のファイルを読み書きしようとして、シンボリック リンクを解決しない場合は/usr/local/home
、おそらく破損するでしょう。ただし、そのようなシナリオが発生する可能性は私にはわかりません。
そうは言っても、変数を変更しないアプローチの方が良いと思います$HOME
。$HOME
起動するすべての対話型シェルの存続期間中にシステムがホーム ディレクトリとして認識しているもの以外のものに変数を変更するのは、見苦しく、ハックっぽく、微妙な問題を引き起こすことになります。より良い代替案を 3 つ紹介します。
オプション1: より適切に配置されたシンボリックリンク
シンボリックリンクを使い続けたい場合、/usr/local
ホームディレクトリから へのシンボリックリンクを作成し、現在のリンクを削除し、から変数/usr/local/home
を変更する行を削除します。例:$HOME
.zshrc
% [~] ln -s /usr/local uloc
% [~] cd uloc
% [~/uloc] realpath .
/usr/local
現在お持ちのものと同様に、ホーム ディレクトリから /usr/local にすばやくアクセスできますが、この方法では を変更する必要はありません$HOME
。
オプション 2: 名前付きディレクトリ
Zshを使っているのであれば、名前付きディレクトリの代わりにHOME=/usr/local/home
、次のようにして、uloc
任意の短い名前に置き換えます。
uloc=/usr/local
その後、このディレクトリに素早く切り替えることができますどこからでも以下の方法で:
# With no special options set
% cd ~uloc
# Slightly shorter
% setopt cdable_vars
% cd uloc
# Even shorter
% setopt cdable_vars auto_cd
% uloc
ご覧のとおり、パスに展開される変数がある場合、文字cd
を前に付けるとZshでその変数にアクセスできます。これは、のショートカットとして~
使用するのと似ています。名前付きディレクトリはいくつでも作成できるので、~user
/home/user
どれでも/usr/local
あなたの場合だけでなく、頻繁に使用するディレクトリです。
オプションを使用すると、を使用するときに名前付きディレクトリcdable_vars
の を省略できます。これは、実際にディレクトリ(名前付きまたはリテラル)である「コマンド」を入力すると、Zsh は自動的にそのディレクトリに移動します。これら 2 つを組み合わせると、目的のディレクトリにすばやくアクセスできます。~
cd
auto_cd
cd
どこにいても。 に反してオプション1シンボリックリンクに依存していないので、cd
この名前付きディレクトリに実際にそのディレクトリに移動します、 は をpwd
返し/usr/local
、 は返しません/Users/njohn/uloc
。
オプション3: CDPATHを使用する
このアプローチは単独でも、またはオプション2。
ディレクトリのリストを保持する の$CDPATH
ような特殊変数 を使用することもできます。ただし、 とは異なり、 のディレクトリは、指定されたパスが現在のディレクトリの下に見つからない場合に、 に指定された相対パスの「ルート」として使用されます。説明のために、次の例を考えてみましょう。$PATH
$PATH
$CDPATH
cd
# Zsh ties lowercase variants of the *PATH variables together as arrays. See zshparam(1) for details
% [~/foo] cdpath=(/usr/local)
% [~/foo] ls
bar/ baz/
% [~/foo] cd share
% [/usr/local/share]
share
にはという名前のディレクトリがなかったので~/foo
、Zsh はが子ディレクトリである可能性がある$CDPATH
場所を調べました。は にあり、はの子ディレクトリなので、の内部から を実行できます。さらに深く進むこともできます。たとえば、が のサブディレクトリである場合、 を実行してそこに到達できます。share
/usr/local
$CDPATH
share
/usr/local
cd share
~/foo
stuff
/usr/local/share
cd share/stuff
注記:Bashとは異なり、Zshは常に現在のディレクトリを参照します。前にのディレクトリを試しています$CDPATH
、ない限りa.
は に含まれます$CDPATH
。その場合、Zsh は 内のディレクトリの順序に厳密に従います$CDPATH
。
こうすることで、さらに便利になります。おっしゃるとおり、自作のパッケージや設定にアクセスする必要が頻繁にあるため、cd
プレフィックスを必要とせずに、どこからでもサブディレクトリの 1 つにアクセスできるようになります。
すでに述べたように、これを名前付きディレクトリと組み合わせることができます。私のドットファイルから例を挙げると、次のようになります。
ZSH=~/.zsh
cdpath=(~/.zsh)
# I split my configuration up into separate files that live in separate
# directories, which all live under a 'modules' directory inside ~/.zsh
% [~] cd modules/directory
% [~ZSH/modules/directory] cd modules/git
% [~ZSH/modules/git]
参考文献
Zsh とその多くの機能* についてもっとよく理解することをお勧めします。以下は、参照できるマニュアル ページやその他のトピックです。
symlink(7)
— シンボリックリンクとその相互作用について詳しく説明します。zshexpn(1)
「静的な名前付きディレクトリ」— 名前付きディレクトリについて説明し、マニュアル ページの残りの部分では Zsh でのあらゆる形式の拡張について説明します。zshparam(1)
, 「シェルで使用されるパラメータ」 — などの特殊変数の説明が含まれcdpath
ますzshoptions(1)
— 組み込みを介して Zsh の動作を制御するすべてのオプションの詳細を示します。この回答で提供されているものよりも詳細setopt
な説明が含まれています。cdable_vars
auto_cd