web-dev-qa-db-ja.com

ディレクトリを変更するためのシンボリックリンクは、ホームディレクトリからのみ機能します

this answerを使用して、.bashrcファイルにシンボリックリンクを作成し、頻繁に使用するディレクトリへの変更を容易にしました。

例えば。

ln -s ~/a/b/c/d/development dev

cd devと入力すると、ディレクトリをhomeディレクトリからdevelopmentディレクトリに変更できます。 homeディレクトリからls devを入力することもできますが、これも機能します。

ただし、これらのコマンドonlyは、私のhomeディレクトリで機能します。他の場所から入力すると、No such file or directoryというエラーが表示されます。

cd ~/devまたはls ~/devを入力すると、機能します。

誰かがそれがなぜであるか、そして私がそれを修正する方法を説明できるので、私が私の家のディレクトリにいないときにパスに~/を含める必要はありません。

5
ksl

シェルとしてBashを使用しているため、CDPATHシェル変数を使用できます。 バッシュマニュアル はそれを次のように説明しています

検索パス:CDPATH内の各ディレクトリ名でディレクトリが検索され、CDPATH内の代替ディレクトリ名はコロン( ‘:’)で区切られます。

.bashrcに次の行を追加できます。

CDPATH=".:$HOME"

後でcd devと入力すると、現在の作業ディレクトリでdevという名前のサブディレクトリが検索されます。

  • そのようなディレクトリが存在する場合、そのディレクトリに変更されます(通常、cd組み込みコマンドが機能するため)。
  • そうでない場合は、ホームディレクトリ(~)を検索し、シンボリックリンクを見つけ(ディレクトリへのリンクであることを認識します)、ターゲットディレクトリ(~/devが指す)に移動します。

ホームディレクトリ内のディレクトリを優先したい場合は、CDPATH$HOME)の最初に"$HOME:."をリストすることができますが、それは-を壊すので、強くお勧めしません。 驚き最小の原則 :結果の動作は標準と大きく異なります。

11

できません。なんてことするんですか? lnコマンドは、別のファイル(またはディレクトリなど)へのリンクであるファイルを作成します。その後、元のリンクであるかのようにリンクを使用できます。しかし、これはまだ単なるファイルです。特定のパスがあり、魔法のように浮かんでいるだけでなく、ファイルシステムのどこからでもアクセスできます。他のファイルと同じように、単に名前で呼び出すことはできません。そのパスを使用する必要があります。

通常のファイルを作成する場合と同じように:

$ cd ~/foo
$ touch file
$ cd ~/
$ ls file
ls: cannot access 'file': No such file or directory
$ ls ~/foo/file
file

リンクも例外ではありません。ランダムディレクトリからcd devを実行して、それが機能することを期待することはできません。ランダムディレクトリでcat fileを実行して、システムが必要なファイルを魔法のように認識することを期待することはできません。

スクリプトまたは関数を使用して目的の動作を取得できますが、リンクは使用できません。たとえば、次の行をシェルの初期化ファイル(bashの場合は~/.bashrc)に追加します。

dev(){
    cd "$HOME"/dev
}

あるいは単に:

alias dev='cd ~/dev'

ここで、devを実行すると、~/devに移動します。または、~/bashrcまたは~/.profileで変数を定義します。

dev="$HOME/dev"

これで、cd $devを実行して、~/devに移動できます。これは多くの方法で可能ですが、リンクは関係ありません。

9
terdon