シェルの環境

INPUT · スライド

エイリアスと履歴

01 / 08

同じことを何回打った?

ここまでで、こんなコマンドを何回も打ったでしょう。

ls -ldu -sk * | sort -n | tail -1grep -n error log.txt

長いし、打ちまちがえるよね。

シェルには、これを楽にする仕組みが2つあるんだ。

エイリアス   長いコマンドに短い名前を付ける履歴         打った手をとっておいて、呼び戻す

どちらも手を減らすための道具だよ。今日はこの2つをやるね。

実はこの2つは、上手い人といちばん差が出るところなんだ。同じことができる人でも、打つ手の数が3倍違ったりする。

初めての人  1つのことに 40 文字慣れた人    1つのことに 8 文字

減らせるのは、道具を知っているからだね。では見ていこう。

02 / 08

alias で短い名前を付ける

こう打つと、短い名前ができるよ。

~ $ alias ll="ls -l"~ $ ll-rw-r--r--  1 manabiya ...

ll と2文字打っただけで ls -l が動いたね。これをエイリアス(別名)と呼ぶんだ。

形はこうだよ。

alias 短い名前="本当のコマンド"

変数の代入と似ているでしょう。= の前後に空白を入れられないのも同じだよ。

作ったものは alias だけ打つと一覧できるよ。

~ $ aliasll='ls -l'

消すときは unalias だね。

~ $ unalias ll

そして1つだけ、引っかかりやすい決まりがあるよ。

~ $ alias f="echo"; f hi-sh: f: not found      ← 同じ行では使えない

シェルは行をまるごと読んでから動かすので、読んだ時点でまだ f を知らないんだ。作ったら、次の行から使ってね。

03 / 08

うしろに足せる

エイリアスはただの置きかえだよ。だから、うしろに好きなものを足せるんだ。

~ $ alias g="grep -n"~ $ g error log.txt

打ったあと、シェルはこう組み立てているよ。

g error log.txt  ↓ g を置きかえるgrep -n error log.txt

行の先頭を置きかえるだけでしょう。だから残りはそのまま渡るんだ。

パイプをまるごとしまうこともできるよ。

~ $ alias ookii="du -sk * | sort -n | tail -3"~ $ ookii

章9で覚えた「犯人を探す」列が、6文字になったね。

ただし、置きかえは行の先頭だけだよ。

~ $ alias t="tail -3"~ $ ls | t          ← これは効かない場所もある

パイプのすぐ後ろは効くけれど、引数の場所では効かないんだ。先頭に来る名前だと思っておくのが安全だよ。

04 / 08

'" で意味が変わる

ここで前の回のクォートが効いてくるよ。この2つは違うんだ。

~ $ alias a="echo $USER"~ $ alias b='echo $USER'~ $ alias aa='echo manabiya'      ← もう決まっている~ $ alias bb='echo $USER'         ← まだ $USER のまま

ダブルは作るときに広がり、シングルは使うときに広がるんだ。

"..."   定義した瞬間の値で固まる'...'   呼ぶたびに、そのときの値になる

どちらが良いかは、やりたいことで決まるよ。

alias home='cd $HOME'        使うときの $HOME でよい → シングルalias me="echo $USER"        今の名前で固めたい → ダブル

迷ったらシングルにしておくのがふつうだよ。エイリアスは「あとで使う文」なので、あとで広げるほうが自然だからね。

前の回で覚えた表が、そのまま道具になったでしょう。

シングル  何も広げないダブル    $ 系だけ広げる

05 / 08

本物を呼びたいときは \

エイリアスは、本当のコマンドと同じ名前にもできるよ。

~ $ alias ls="ls -1"~ $ ls(1列で出る)

便利だけれど、たまに本物を呼びたくなるよね。そんなときは頭に \ を付けるんだ。

~ $ \ls(本物の ls が動く)

command を頭に付けても同じだよ。

~ $ command ls

どちらも「エイリアスを飛ばして、本物を呼べ」という意味だね。

これは実務で本当に助かる場面があるよ。

alias rm="rm -i"     消す前に必ず聞かせる(安全用)\rm ooi-fairu-*      たくさん消すときだけ飛ばす

ふだんは安全側、必要なときだけ外すという使い方だね。

type で正体を確かめられるのも覚えておいてね。

~ $ type llll is an alias for ls -l

章の2本目で type を覚えたでしょう。あのときの「組みこみか外の道具か」に、エイリアスが加わったんだ。

06 / 08

エイリアスは子に伝わらない

変数のときにやった実験を、エイリアスでもやってみるよ。

~ $ alias ll="ls -l"~ $ sh -c "alias"(何も出ない)

伝わっていないね。エイリアスは export できないんだ。

環境変数    export すれば子に伝わるエイリアス  伝わらない(そのシェルだけのもの)

だからスクリプトの中では、エイリアスは使えないと思っておいてね。書いたスクリプトは子シェルで動くからだよ。

#!/bin/shll              ← 動かないls -l           ← こう書く

スクリプトでは省略せず、ちゃんと書くんだ。ここが手で打つときと、書いておくときの違いだよ。

手で打つ     短くしたい     → エイリアス書いておく   確実に動かす   → 省略しない

章11でスクリプトを書くときに、この区別が役に立つよ。

07 / 08

打った手は残っている

もう1つの道具、履歴だよ。

を押すと、1つ前に打ったコマンドが出てくるんだ。画面の下の記号バーに があるでしょう。押してみてね。

↑        1つ前↑↑       2つ前

出てきたものは、そのまま で打ち直せるよ。打ちまちがえたときは、 で呼び戻して直すのがいちばん早いんだ。

一覧で見ることもできるよ。

~ $ history    1 pwd    2 ls -l    3 alias ll="ls -l"

1つ注意があるよ。history の出力は標準エラーに出るんだ。

history > a.txt      取れない(空になる)history 2> a.txt     取れる

章4でやった 1>2> の区別だね。出口が2つあることを知っていれば、こういう変わり者も扱えるでしょう。

履歴はファイルにも残るよ。

~ $ echo $HISTFILE/home/manabiya/.ash_history

名前が . で始まっているので、ls -a でないと見えないね。章1でやった隠しファイルだよ。

08 / 08

さあ、打ってみよう

この回で使う形をまとめておくね。

alias ll="ls -l"       短い名前を付けるalias                  一覧を見るalias ll               1つだけ見るunalias ll             消すunalias -a             全部消すtype ll                正体を確かめる\ls                    本物を呼ぶhistory 2> a.txt       履歴を取る↑                      前のコマンドを呼び戻す

1つ、先に言っておくことがあるよ。

> エイリアスは、端末を閉じると消える

作ったものは、そのシェルの中だけのものなんだ。次に開いたときには何も無いよ。

いま作る        →  この端末だけ毎回ほしい      →  次の回でやる

次の回が章10の最後、.profile だよ。開くたびに読ませる場所があるので、そこに書いておけば毎回使えるようになるんだ。

つまり今日は、「毎回やってほしいこと」を先に決める回でもあるね。打ちながら「これは毎回ほしい」と思ったものを覚えておいてね。では打ってみよう。