初心者の頃、おっかなびっくり自力で編み出して、
今でも重宝しているシェルのチップスを共有します。
ひょっとしたら、中上級者には当たり前すぎて無意味かもしれません。
概要
$ echo "cd /home/start/a/b/c/d/e" >w
$ . w
$ pwd
/home/start/a/b/c/d/e
これで意味が、あるいは無意味がわかった方は読まなくて大丈夫です。
動機:ln
コマンドこわい
Linuxで、Windowsでいうショートカットの代わりに、
ln
コマンドでリンクを張っている人が多いと思います。
$ pwd
/home
$ ls
start
$ ls ./start/a/b/c/d/e
ReadMy.txt xxx.c yyy.c
たとえばこんな深いところに作業場がある環境で、
$ ln -s start/a/b/c/d/e work
と叩いておけば
$ ls
start work
$ cd work
$ ls
ReadMy.txt main.c sub.c
これですぐに作業に取りかかれる、という仕組みですね。
ただ、愛用者には悪いんですが、これあまり使いたくないんです。
##こわいことその1:絶対パスが。。。
このリンクだと、
$ pwd
/home/work
絶対パスが実際のそれと食い違ってしまっています。
ホームディレクトリから普段使いする作業場に、くらいならまだいいのですが、
「じゃあ上のd
ディレクトリを見てみましょう」と思っても
$ cd ../
$ ls
start work
$ pwd
/home
$ # ???
となってしまいます。しかも階層ごとに別のMakefileでもあった日には
誤って全makeしてしまう、なんてことも。怖くて使えません。
こわいことその2:循環が。。。
たとえば日本語と英語の文書を
$ ls ./a/b/c/JA/d/e/
index.html about.html information.html
$ ls ./a/b/c/EN/d/e/
index.html about.html information.html
と管理していて、日本語と英語を行ったり来たりして作業するとします。
ここで
$ cd ./a/b/c/JA/d/e/
$ ln -s ../../EN/d/e/ en
$ cd en
$ ln -s ../../JA/d/e/ ja
なんて作ってしまった日には、
$ cd ~/a/b/c/JA/d/e/en/ja/en/ja/en/ja/ # ...
無限ループが出来てしまいます。怖くて使えません。
#解決:.
をつかう
そこでおっかなびっくり編み出したのが、
$ echo "cd /home/start/a/b/c/d/e" >w
$ . w
これだけ。
.
はsource
コマンドと同義で、引数に受け取ったファイルの中身が
コマンドラインに直接打ち込まれたと思って実行します。
環境変数のバッチとかに使うやつですね。
なので、. w
はファイルの中身cd /home/start/a/b/c/d/e
を
直接叩いたのと同じことになって、自然なディレクトリ移動ができます。
これでWindowsのショートカットに近いことができます。
実行権限や環境変数をいじる必要すらなく、コピーして使い回しても問題ない。
小心者にもお手軽です。
はた目には「細かいメモファイルが散らかってるだけ」ですしね。
##使用例
$ ls
e start/ j
$ . j # 日本語作業ディレクトリへ
$ pwd
/home/start/a/b/c/JA/d/e/
$ ls
e index.html about.html information.html r
$ . e # 英語版へ平行移動
$ pwd
/home/start/a/b/c/EN/d/e/
$ ls
index.html about.html information.html j r
$ cat r
cd /home
$ . r # 「このプロジェクトのルートディレクトリ」も作っておくとさらに便利
$ ls
e start/ j