DMM WEBCAMP AdventCalendarの10日目を担当いたします、@solare_tech です。
大雑把にいうと、DMM WEBCAMP運営部の中の人の1人です。何卒よろしくお願いします。
めんどくさいコマンドを簡略化できるエイリアス
みなさん、ターミナル使いこなしてますか?
プログラミングに取り組む上で、ターミナルのコマンドが複雑と感じる人は結構多いんじゃないかなと思っています。
一つの動作を実行するのに、いちいち長いコマンドを入力するのは面倒ですし、もっと簡略化したい……。
そんな願いを叶えてくれる便利なヤツが、エイリアスです。
ターミナルを知ろう
エイリアスとは何かを説明する前に、エイリアスというものを取り巻くターミナルについて説明していきます。
ここでは、まずイメージを持ってもらうことを重視しますので、具体的なコマンドやスクリプトの記法については、そんなに話しません。
指摘、疑問のコメントは大歓迎です!!
キーワード
ターミナル
コマンドを使ってパソコンを操作するための、Macアプリケーションです。
後述しますが、Windowsでは**Git Bash**などを導入することで、同じ動きができます。
コマンド
ターミナルでパソコンを操作するための命令文です。
シェル
パソコンの中身と我々人間をつなぐ受付係。
我々人間は、ターミナルを介して「パソコンさんにこういう動作をお願いしたいんだけど」とお願いをします。
このお願いの部分が、コマンドです。
bash
シェルさんの進化系。
macOSのターミナルやWindows用のGit bashなどには、このbashという名前の受付係さんが待機しています。
進化した分、シェルさんより仕事の効率が良いらしいですが、今のところ、違いは意識しなくても問題ありません。
【参考】bashとは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
参考 : bashの仲間
bashと同じような仕事をする仲間として、zsh、cshなどがあります。違う会社の受付をしていたり、一つの会社の中でbashさんやzshさんが受付を担当していたりと、形はさまざまです。
エイリアス
ここで、いよいよエイリアスの登場です。
エイリアスとは、ざっくりいうと、bashさんが知っている略語です。
略語というと、皆さん何を思い浮かべますか?
例えば、**「ググる」**という言葉。
この言葉は、「Googleで検索して、意味を調べる」という略語です。
また、今年流行ったタピオカドリンクに関連して生まれた、**「タピる」**という言葉。
これは「タピオカドリンクを買って飲む」という意味の略語になります。
このように、「別の行動を略語として言い表しているもの」が、エイリアスです。
エイリアス | 実際に行うこと |
---|---|
ググる | Googleで検索して、意味を調べる |
タピる | タピオカドリンクを買って飲む |
.bashrc / .bash_profile
この後、.bashrc
と.bash_profile
というふたつのファイルを編集していただきます。
ざっくり言うと、これらはbashさんのお仕事マニュアルです。
bashさんが我々人間の応対を行うときに必要な知識が、ここに書かれています。
そして、bashさんが使えるエイリアス=略語
も、ここに書かれています。
bashさんは、全く初めての状態から**「タピる」**という略語を知っているわけではありません。
.bashrc
に「タピる」という言葉が書かれて初めて、「タピる=タピオカドリンクを買う、飲む」という意味を知るのです。
言い換えると、.bashrc
にエイリアスを追加してあげることで、bashさんはエイリアスを意味のある略語として理解することができます。
また、bashさんのマニュアルには
.bash_profile
.bashrc
の二つがあります。
これも大まかに説明すると
.bash_profile
:ターミナルへのログイン時にbashが確認するマニュアル
→朝一番で出勤して、誰よりも早く受付に立つ前に目を通すイメージ
.bashrc
:他の係員(zshなどの他のシェル)と交代したときにbashさんが確認するマニュアル
→昼から出勤して、別の人と交代した時に目を通すイメージ
この辺りは、実際にエイリアスを書くときに詳しく説明します。
エイリアスを作ってみよう
.bashrcを書き換えてみよう
1. 何はともあれやってみよう
まずは.bashrc
を書き換えてみましょう。
先ほどお伝えした通り、ここに略語をどんどん登録していきます。
Macであればターミナル、WindowsであればGit Bashなどを開いてみましょう。
開いたら、まず下記のコマンドを打ってみましょう。
(以下、Windowsの方は「ターミナル」を"Git Bash"などに読み替えてください。)
vi ~/.bashrc
すると、ターミナル上でvi
というテキストエディタが起動します。
何か記述されていたり、されていなかったりするかもしれませんが、一番最後の行に下記を追加しましょう。
alias tapioka="echo 'タピオカ最高〜〜〜〜!!!!'"
追加したら、:wq
で保存終了し、下記のコマンドを打ち込んでいきましょう。
$ source ~/.bash_profile
ここでエラーとなった場合は、2に進んでみましょう。
エラーにならなかった場合は、下記のエイリアスを打ち込んでみましょう。
$ tapioka
タピオカ最高〜〜〜〜!!!!
このように表示されれば成功です!
2. 上手くいかなかった場合
.bash_profile
が存在しないか、下記の記述が足りていないかもしれません。
いずれの場合も、下記の手順で対応しましょう。
$ vi ~/.bash_profile
開けたら、下の一行を追加しましょう。
source ~/.bashrc
:wq
で保存終了し、再度下記のコマンドを打ち込みます。
$ source ~/.bash_profile
改めて、下記のエイリアスを打ち込んでみましょう。
$ tapioka
タピオカ最高〜〜〜〜!!!!
このように表示されれば成功です!
結局何をやっていたの?
一つ一つの要素を見ていきましょう。
alias
は、略語を設定するためのスクリプトです。
alias [略語]="[略語を打ち込んだ時に発動するコマンド]"
今回は試しに、tapioka
というエイリアス(=略語)を作っていきます。
tapioka
というエイリアスを入力した時に、ターミナル上に**「タピオカ最高〜〜〜〜!!!!」**と表示されるようにします。
通常、ターミナル上に文字を表示させたいときは、echo
コマンドを作ります。
試しにターミナルにechoコマンドを打ち込んでみましょう。
$ echo 'タピオカ最高〜〜〜〜!!!!'
タピオカ最高〜〜〜〜!!!!
しかし、いくらタピオカが大好きでもいちいちecho 'タピオカ最高〜〜〜〜!!!!'
を打ち込んでいると面倒なので、これをtapioka
というエイリアスとしてまとめます。
alias [略語]="[略語を打ち込んだ時に発動するコマンド]"
↓
alias tapioka="echo 'タピオカ最高〜〜〜〜!!!!'"
注:"="の両側にはスペースを一切入れないでください!!
これで.bashrc
の記述は完成です!
ただ、せっかく更新した.bashrc
も、変更点がbashさんに伝わらなければ意味がありません。
マニュアルが更新されたのに、全く読まれていない状況です。
そこで、bashさんにエイリアスの内容を読み込ませるために、source
コマンドを使います。
source
は、**「指定した場所にあるマニュアルを、bashさんに読み込ませて覚えてもらうコマンド」**です。
しかし、ここはシンプルには行きません。
なんと、3ステップを踏んで頂きます。
まずこうして
$ vi ~/.bash_profile
こうして
# もし下記の一文が無ければ、追加し、保存終了。
source ~/.bashrc
こうです!
$ source ~/.bash_profile
……何をやっているのかというと
-
.bash_profile
をテキストエディタで開いて -
source ~/.bashrc
を追加し、保存終了 - ターミナルで
$ source ~/.bash_profile
を実行し、bashさんに.bash_profile
を読みこんでもらう
「書き換えたのは.bashrc
なのに、読み込むのは.bash_profile
?」
「てか、.bashrc
だけ読みこんでもらえば良いのでは?」
もしかしたら、こんなこと思った人もいるかも知れません。
.bash_profile
は、ターミナルへのログイン時にbashさんが確認するマニュアルと説明しました。
一般的には、ターミナルを起動した時に読み込まれるマニュアルだとお考えください。
一方で、.bashrc
は他の受付係員からbashさんに交代した時に、bashさんが読み込むマニュアルです。
あまりイメージが沸かないかもしれませんが、同じターミナルでbashやzshなど、いくつかのシェルを使うことがあります。そんな時、切り替え=他の受付係員との交代が発生します。
今のところは「へ〜別の係員になる時があるんだ〜」くらいに考えておいてください。
エイリアスは、どんな状況でも使えるのが理想ですが、.bashrc
と.bash_profile
、どちらかに記述されているだけだと、使える時と使えない時が発生します。
これに対して、頭のいい人は考えました(多分)。
「ログイン時に読み込む.bash_profile
に、.bashrc
を読み込むように指示書いちゃえば
どんな時も全部のマニュアルに目を通してくれるんじゃない?」
かくして、.bash_profile
に下の一文を追加した上で、
source ~/.bashrc
下のように、もう一回、.bash_profile
を読み込ませる
$ source ~/.bash_profile
そんな、ややこしいことになったのでした。
ちなみに、.bash_profile
はターミナルを起動しても読み込まれるので、$ source ~/.bash_profile
の代わりに、ターミナル自体を再起動してもOKです。
まとめ
- エイリアスを
.bashrc
に書き込み、保存 -
.bash_profile
に一行追加し、source ~/.bashrc
を追加、保存 -
$ source ~/.bash_profile
、もしくはターミナルの再起動 - エイリアスが使えるようになる!
エイリアスのルール
使い方が分かったところで、いよいよ実践です。色々なコマンドをエイリアス化していきましょう!
ただし、何でもかんでもエイリアスにしてしまうのはかえって混乱を招きます。
エイリアスのルールをあらかじめ自分で決めておくことで、エイリアスの乱立を防ぎましょう。
参考までに、私がエイリアスを作るときに決めているルールをお示しします。
- 必ず1日に一回は使う→よく使うコマンドの簡略化
- 処理が複数あり、その複数の処理が一連の動作として決まっている→よくやる処理のパッケージ化
どちらかに当てはまるコマンド・処理について、エイリアスを作るようにしています。
よく使うコマンドの簡略化
case : よく使うディレクトリへのショートカットコマンドを作成する
多くの方はデスクトップ等に作業ディレクトリを作り、その中にアプリやコードを格納しているのではないでしょうか。
例えば、デスクトップにあるhogehogeフォルダの中にwork_directoryというフォルダを作り、そこにアプリのディレクトリなどを作成しているとすると、ターミナルを起動するたびに
$ cd Desktop/hogehoge/work_directory
と打ち込む必要があります。
一回であれば良いですが、毎日毎日同じ作業だとなんだか面倒ですよね。なので、エイリアスにしましょう。
alias wk=‘cd ~/Desktop/hogehoge/work_directory‘
"work_directory"の"work"→"wk"をエイリアスとしました。
エイリアスを定義する時、cdに指定するパスに、ホームディレクトリから始める絶対パスを使用しているので、どのディレクトリに居ても作業ディレクトリに移動できます。
【応用】よくやる処理のパッケージ化
今までのエイリアスは、一つのコマンドに対して一つのエイリアスを設けていましたが、複数のコマンドをまとめる方法があります。それがfunction
です。
functionとは、複数の処理をまとめて書くやり方です。関数とも言われます。
エイリアスは、基本的に一つの処理を置き換えることしかできませんが、これを合わせ技で使うことで複数の処理をエイリアスでまとめられます。
下記で、hogehogeという名前のfunctionについて見てみましょう。
function hogehoge() {
# 上から順番に処理が実行される
処理1
処理2
}
# エイリアスをabとして、hogehogeの中身(処理1、処理2)を実行する
alias ab=hogehoge
このように書くことで実現できます。
ここで、関数の場合はダブルクォーテーション(")で囲まないことに注意しましょう。
case : ディレクトリを移動した瞬間に、ディレクトリの中身を表示する
ディレクトリを移動した時に個人的によくやるのが、その先にどんなファイルやディレクトリが存在するのかの確認です。コマンドだと、こんな感じになります。
# hogehogeディレクトリに移動
$ cd hogehoge
# hogehogeディレクトリの中身を全て表示
$ ls -a
これについて、cd
と入力しただけで上二つの処理を同時に行うようにすることも、エイリアスならできます。
まず、結論からお伝えします。
function cdls() {
# cdがaliasとして設定されると、ループするので\をつける
\cd $1;
ls;
}
alias cd=cdls
$1,\cdと、見慣れない書き方が2つも出てきました。
まず、$1
の説明です。
結論から言うと、「1番目の引数」ということです。
cdというコマンドは、続けて「移動したいディレクトリのパス」を指定しますが、これが「1番目の引数」となります。
コマンドやエイリアスの中には、続けて追加情報をスペースで区切って入力する必要のあるものがありますが、この追加情報が「引数」となります。
例えば
コマンド(エイリアス) 追加情報1 追加情報2
となった場合、追加情報1に入力されたデータが$1
、追加情報2に入力されたデータが$2
となります。
cdの場合は
cd 移動先のパス(追加情報1)
となるため、入力された移動先のパスが$1
に入ってきます。
まとめると
function cdls() {
# cdの後に入力された移動先パスに移動
cd $1;
# 移動した後に、移動先のディレクトリの中身を表示
ls;
}
# cdlsとしてまとめた処理を、エイリアスとしてまとめる
alias cd=cdls
となります。
最後に、\cd
の説明です。
cdというコマンドは、もともと存在するものですが、今回cdというエイリアス
を作ったことで、そちらを優先的に読み込みに行ってしまいます。
エイリアスを読みに行くと、何が起こるでしょう?
-
$ cd Desktop
とターミナルに入力 - cd=cdlsなので、
function cdls
を上から順に実行 -
cd $1
を実行。ここでは$1の中身はDesktopなので、cd Desktop
となる。 - cd=cdlsなので、
function cdls
を上から順に実行 -
cd $1
を実行。ここでは$1の中身はDesktopなので、cd Desktop
となる。 - cd=cdlsなので、
function cdls
を上から順に実行 -
cd $1
を実行。ここでは$1の中身はDesktopなので、cd Desktop
となる。
…
…
…
といった具合に、ループしてしまいます。
これを防ぐために、\cd
という表記をします。
「これはエイリアスではないよ!」ということを明示するための書き方だと考えてください。
長くなってしまったので、まとめると
- 複数処理をエイリアスにする時は、
function
を使って処理をまとめる - エイリアスで追加情報を入力させる時は、functionの中に
$1
などを追加し、追加情報をfunctionの中で処理できるようにする - エイリアスとコマンドが同じ場合、処理の中で
\cd
としてコマンドであることを明示しないと無限ループが起こる
【オマケ】Railsアプリを新しく作る時、Gem deviseのインストールと管理・ユーザーモデルの構築までを一つのエイリアスで
RubyやRuby on Railsをインストールしている場合、それらのコマンドもエイリアスで使えます。
私はRailsでアプリを開発する時、devise
というGem(プラグイン)を使ってログイン機能を作ることが多いのですが、本来なら
- Railsアプリを新しく作って
- Railsアプリのディレクトリに移動
- Gemfile(プラグインを記載するファイル)にdeviseを追記して
- deviseをインストール
- deviseを使ってAdmin(管理者),User(一般ユーザー)のテーブルを作成
というような、いくつかのステップを踏む必要があります。
面倒なのでまとめたものがこちらになります。
詳しい説明は省きますが、「こんなこともできるんだな〜」程度に見ていただければと思います。
function rails_with_devise(){
rails new $1;
cd $1;
echo "gem 'devise'" >> Gemfile;
bundle;
rails g devise User;
rails g devise Admin;
rails db:migrate;
}
alias rwd=rails_with_devise
最後に
いかがだったでしょうか。
ほんの一例しかお伝えできませんでしたが、エイリアスは使いこなせると、作業効率がグンと上がります。
これを機に、自分流のエイリアスを作ってみましょう!
参考
bashとは | 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
.bash_profileと.bashrcなんて使い分けなくてよかったんや!
Linux: .bashrcと.bash_profileの違いを今度こそ理解する
コマンドの先頭にエスケープ文字