【ln -s path symbol】
大事なディレクトリへの
シンボリックリンクを作る

ln -s 実体ファイル シンボリックリンク名Code language: Bash (bash)
  • macOS ターミナル、bash

関連記事

1. よく使うディレクトリにシンボリックリンクを作る(ln -s 場所 シンボル)

シェルで ~/.local/bin にパスを通して、そこに自分用のスクリプトを実行権限を付けて置いておいて、ターミナルでコマンドとして使えるようにしています。

ただ、たまにスクリプトを編集したいときがあるのですが、ふだんは保存場所を意識しないので、ディレクトリ名を忘れます1
そこで、ふだんの作業ディレクトリからすぐ入れるショートカットを作りました。

ln -s ~/.local/bin local-command-scriptsCode language: Bash (bash)

私は、~/local_code を作業ディレクトリとして使っているので、そこに local-command-scripts という名前で ~/.local/bin へのリンクを作ります。
そうすれば、cd で移動できます。

1.1. リンクが元?実体が元?

ln -s は、「リンク先実体 シンボル名」の順で指定し、シンボルを「作る」コマンドです2

シンボリックリンクというと、「シンボルが元で、実体ファイルが先」のようにイメージしていたのですが、そうではありません。
できあがるシンボルは、「シンボル名 -> リンク先」ですが、生成時は ~/.local/bin が元(実体)で、local-command-scripts が今いるディレクトリに作られるリンク名です。
「実体ファイルを元(ソース)に、目標物であるシンボリックリンクを作る」という構造になっているのです。

1.2. シンボリックリンクの確認(ls -l)

作ったシンボリックを確認します。

ls -l local-command-scripts

#=> lrwxr-xr-x  1 username  staff  24  5 20 11:49 local-command-scripts -> /Users/username/.local/binCode language: Bash (bash)

先頭の l はシンボリックリンクであることを示し、-> の右側が実体のパスです3

1.3. 論理パスと物理パス(pwd -P)

cd で移動してパスを確認します。

cd local-command-scripts
pwd
#=> /Users/username/local_code/local-command-scriptsCode language: Bash (bash)

すると、pwd はシェルがたどった論理パスを表示します4
物理パスを確認するには pwd -P を使います。

pwd -P
#=> /Users/username/.local/binCode language: Bash (bash)

つまり、見かけ上は ~/local_code/local-command-scripts にいますが、実体は ~/.local/bin です5

ディレクトリへのシンボリックリンクは、基本的にそのまま削除できます。

rm にリンク名をそのまま渡せば、削除されるのはリンクだけで、ディレクトリの中身は残ります。

rm local-command-scriptsCode language: Bash (bash)

2.1. シンボリックリンクが評価されるとき?

ただし、シンボルの末尾に / を付けると挙動が変わります。

特に、-r オプションを付けるとシンボルは評価され、リンク先のディレクトリをたどって中身を削除しようとします6

# ディレクトリが削除されるので要注意
rm -r local-command-scripts/Code language: Bash (bash)

あるいは、明示的にunlinkを使う方法もあります。

unlink local-command-scriptsCode language: Bash (bash)

unlink はリンク自身だけを削除するコマンドなので、末尾スラッシュのような操作ミスが起きません。

  1. ~/.local/bin をシェルから使うには、あらかじめ PATH に追加しておく必要があります。たとえば ~/.zshrc~/.bashrcexport PATH="$HOME/.local/bin:$PATH" を書いておくと、そこに置いたスクリプトをコマンド名だけで呼び出せます。 – How to add a path to zsh or bash on Linux
  2. この引数順は POSIX で定められています。ln [-s] source_file target_file という形式で、元(source)が先、宛先(target)が後ろです。cp コマンドと同じ順序なので、コピー元を先に書くと覚えておくと混乱しにくいです。 – ln(1p) POSIX man page
  3. ls -l の先頭文字はファイルの種類を表します。- が通常ファイル、d がディレクトリ、l がシンボリックリンクです。シンボリックリンクはパス文字列を格納した特殊なファイルで、参照先とは独立して存在します。 – What Are Symlinks in Linux and How Do You Create and Remove Them?
  4. pwd はシェルのビルトインコマンドで、外部の実行ファイルではなくシェル自身が処理します。そのため、シェルが「どの経路でここに来たか」という内部状態をそのまま返します。Bash・Zsh ともにビルトインとして実装されています。 – Linux and Unix pwd command tutorial with examples
  5. -P オプションはシンボリックリンクをすべて解決して物理パスを返します。スクリプト内でパス比較や安定したファイル操作をしたい場合は、pwd -Prealpath を使うと意図しないリンク追跡を防げます。 – Displaying the Current Working Directory in Linux
  6. 末尾スラッシュを付けると、OS はシンボリックリンクではなくその参照先のディレクトリとして扱います。rm -r link/ とすると参照先ディレクトリの中身を再帰的に削除しようとし、データロスにつながります。unlink リンク名 を使うとリンク自身だけを確実に削除できます。 – Symlinks Explained: How to Create and Use Symbolic Links on macOS and Linux