Skip to content

Instantly share code, notes, and snippets.

@showa-yojyo
Created July 28, 2026 02:33
Show Gist options
  • Select an option

  • Save showa-yojyo/f0584c60026cde627ce18dc3c3653c39 to your computer and use it in GitHub Desktop.

Select an option

Save showa-yojyo/f0584c60026cde627ce18dc3c3653c39 to your computer and use it in GitHub Desktop.
A note on tilde expansion in Bash
author プレハブ小屋 <2386769+showa-yojyo@users.noreply.github.com>
created 2026-07-28
draft true
tags
bash
expansion
tilde
title Bash tilde expansion ノート

Bash tilde expansion ノート

早見表

tilde prefix expansion
~ $HOME の値に等しい
~fred fred の home directory の絶対パス
~+ $PWD に等しい
~- $OLDPWD かリテラル ~- に等しい
~+N dirs +N が示す文字列に等しい
~N 同上
~-N dirs -N が示す文字列に等しい

解説

以下、ある文字が、引用符で囲まれておらず、escape されてもいない場合、その文字はむき出しであると表現する。

語がむき出しの ~ で始まる場合、その位置からむき出しの / の位置か、なければ語末までを tilde prefix という。

展開の挙動

  • tilde 展開の結果は引用符で囲まれたものと同様の扱いになる。置換の際、語分割やファイル名展開は起こらない。
  • tilde 展開が失敗すると、元の文字列のまま残る(リテラル扱いになる)。

Bash は各変数への代入式において、むき出しの tilde prefix が次のいずれかの文字の直後にあるかどうかを調べる:

  • :
  • 最初の =

発見した場合、tilde 展開を施す。

Note

この性質のおかげで、シェル変数 PATHCDPATH に対する代入式において、tilde prefix を含むファイル名を利用できる。

誰かの home directory に展開する場合

Bash は tilde prefix 内の文字がいずれもむき出しの場合、その ~ に続く文字列をログイン名候補として扱う。

  • Bash はこの文字列が空であるならば、~$HOME に置き換える。 シェル変数 HOME が unset であるならば、実行者の home directory パスに展開する。
  • ログイン名候補が空でないならば、Bash は tilde prefix をこのログイン名に関わる home directory パスに置き換える。

作業 directory に展開する場合

Bash は tilde prefix が

  • ~+ の場合、その部分を $PWD で置き換える。
  • ~- の場合、シェル変数 OLDPWD が設定されていればその部分を $OLDPWD で置き換える。

さらに数 N を伴う場合も Bash は tilde prefix を特別に展開する。

  • ~+N~-N のような tilde prefix は directory stack の対応するパス要素に展開される。言い換えると、命令 dirs +N 実行時の移動先パスに展開される。
  • 符号のない ~N のような tilde prefix は ~+N と同等に扱われる。

Note

適当にディレクトリーをいくつか pushd して dirs -v を見るがいい。


以上

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment