web小説礼賛記

さらなる俺 TUEE をあなたに!

シェル入門 #3: 初見(マニュアル、操作法、予備知識、bashrc)

 第三弾では、シェルが初見の人に必要な知識を扱います。ただ、まずは新しいLinuxの教科書を読むべきだと思います。$文字が何を表すか分らなければ、尚更のことです。

 シェルはbashの前提で行きます。最近のMacはデフォルトでzshを入れているので、時代は変わるようですが……。

マニュアルなど

tldr

 tldrは、非公式ですが最速のマニュアルです。コマンドの概略と、いくつかの例を見せてくれます。インストールしておくと良いでしょう。

 新しいコマンドを見たときは、まずこれを引けば良いと思います。

man

 manは、コマンドの公式マニュアルをwebから取ってきて表示するコマンドです。しばしば詳しすぎるため、参照性は低いと思います。

 man bashでは、bashシェルの文法が見られます。

日本語版のmanを入れる

 方法? 要改稿。

less

 manは、ページャ(閲覧用ソフト)としてlessを使用しています。重要な操作としては、

キー 意味 解説/備考
q quit 閉じます
h help 操作法が見られます
/ search n、Nで前後を検索
& search all 検索パタンを含む行を抽出します

 &検索を終了するには、再び&キーを押してから、Enterとすればいいです。

その他ヘルプの表示法

<command> --help

 引数やオプションのリストが見られます。

help <built-in command>

 built-inコマンド(シェルのソースに実装が書いてあるコマンド)のマニュアルです。--helpを渡した時と同じ表示が出ます。

操作法

 ターミナル上のシェルの操作について。

補完 TAB

 TABキーで、パスやコマンドの『補完』(自動入力)がされます。候補が複数ある場合は、補完は実行されません。(候補は、現在の入力内容によって絞られます)。二度押せば、すべての候補が表示されます。

履歴/コマンドの停止

 特に停止は必須です。<C-x>はCtrl+xを意味します。

操作 機能
↑↓ コマンド履歴の移動
<C-r> 履歴の検索
<C-c> コマンドの停止

 なお、<C-z>で実行中のプロセスを停止し、fgコマンドで戻ってくることもできます。less、man、Vimなどで使えます。

historyコマンド

 履歴番号とコマンドの内容を列挙します。!<履歴番号>で、過去に実行したコマンドを再実行できます。

ショートカット/操作性

 Macでは、EMacsと似たショートカットが設定されています。他の環境でも、set -o emacsを実行すれば使えるはずです。

操作 機能 対応 機能
C-a 行頭へ C-e end 行末へ
C-f forward 右へ C-b backward 左へ
C-d delete C-h backspace
C-k 行末まで削除
C-n next line 次の履歴 C-p previous line 前の履歴

 実は、set -o viとすると、vi(エディタ名)の操作性を利用できます。vimではないため、visual modeは利用できませんけれど。

 setコマンドの実行は、後述の.bash_profileに書けば、自動化できます。

予備知識

表記法

プロンプト$(もしくは#

 ユーザの入力待ちを意味する文字です。$はユーザ、#はルートアカウントを表します。プロンプトは、ユーザ名やディレクトリ位置を含むことが多いですが、このブログでは、常に省略して$と表します。

高級なプロンプト

 パスとコマンドで行を分けたり(二行プロンプト)、コマンドの入力後に改行が入るような表示もあります。時刻や作業状況を表示するものもあります。

 配布されているものは、試すのが楽でしょう。

パス

記号 意味
~/ ユーザのホームディレクトリ($HOMEと同じ)
./ 現在のディレクト
../ 1つ上の階層(ディレクトリ)
/ ルートディレクト

 ディレクトリ名の後にスラッシュを入れるかは任意です(これは一般的なPOSIX規格)。

隠しファイル

 .から名前が始まるファイルは、隠しファイルとして扱われます。

bashのsetコマンド

 bashの設定は、環境変数エイリアス、シェル関数、そしてsetコマンドで行います。

 setは組み込みのコマンドで、色々できます。特にスクリプトを書くときに役立ちます。

bashの設定ファイル(飛ばしてもいいです)

 存在しない場合は、自分で作って保存します。GUIのエディタを使っても良いですし、Vimなど、CLIのエディタに慣れてからでも構いません。

予備知識

rcファイルとは

 run commandsファイルの略です。単にシェルコマンドのリストと思って良いでしょう。

 書き換えたら、source ~/.bashrcなどとして、その場で反映できます。(~/.bashrcが現在のシェルで実行されることで、設定が書き換わります)。

 ~/.bashrcの設定によく使う機能を紹介します。

エイリアス(別名を付ける)

 alias name='words'

シェル関数の定義

 function() { .. ; }(現在のシェルで実行されるシェル関数)

分割ファイルしたrcファイルの読み込み

 source <file>

bashのrcファイル

~/.bash_profile

 このファイルのコマンドは、シェルへの『ログイン』時に実行されます。詳しくは、man bash > INVOCATION に乗っています。

 export環境変数を設定する場合、~/.bashrcに書きます。

# ~/.basrc を『ログイン』時にも実行する(重要)
source ~/.bashrc

# プロンプト文字を <ディレクトリ名> $ と言う形式にする
# 文字色0;32mは黄緑色
export PS1='\[\e[0;32m\]\w \[\e[0m\]\$ '

# 重複するコマンド履歴を自動削除(上キーで履歴を遡るのが便利になる)
export HISTCONTROL=ignoredups
プロンプト文字の設定方

 ANSIカラーコードに基づいて着色できます。配布されているプロンプト文字を利用するのも良いでしょう。

~/.bashrc

 対話モードの非ログインシェルを起動する度に読み込まれます。上記の追記により、ログイン時(ターミナルの起動時)にも読み込まれるようになりました。

 エイリアスやシェル関数をここに書きます。好みで設定してください。dotfilesで検索すれば、他の人の設定も見られます。

# ~/.bashrc

# "$n": n番目の引数の内容
# "$@": 全ての引数

# command <some_command>: シェル関数を無視してコマンドを呼ぶ (詳しくはhelp commandを参照)
# 無限ループを避ける場合などで有効

##### man #####
# pagerを変更(manが使用する環境変数を設定する方法もある。詳しくは: man man)
man() { command man -P 'command less -iNMR' "$@"; }
# マニュアルの見出しを手に入れる
man-table() { man "$@" | grep -v '^\s'; }

##### prompt string  #####
# n: normal, s: short
ps-n() { export PS1='\[\e[0;32m\]\w \[\e[0m\]\$ '; }
ps-s() { export PS1='\$ '; }

##### source #####
alias src='source'
src-b() { source ~/.bash_profile; }
src-v() { source ~/.vimrc; }
alias v='vim'
v-src() { vim "$1"; source "$1"; }
v-bash() { vim-src ~/.bashrc; }

##### cd を pushd にすり替える #####
cd() { command pushd "$@" > /dev/null; } # pushdの出力は捨てる
pd() { command popd "$@"; } # pd: pop directory でディレクトリ位置を遡る
cdh() { command dirs "$@"; } # ディレクトリ移動の履歴を表示
mkcd() { mkdir -p "$@" && cd "$@"; }
.() { cd ../"$1"; }
..() { cd ../../"$1" }
...() { cd ../../../"$1"; }
....() { cd ../../../../"$1" }
.....() { cd ../../../../../"$1"; }

#### 閲覧用 #####
 ls -F: classify (file, directory/, symblic_link@, executable*, のようになる)
 ls -G: enable colorized output
s() { command ls -FG "$@"; } # ls: list
ll() { command ls -FGAlh "$@" ; } # ll: list in long output
# list directories
lsd() { command ls -FGA "$@" | grep '/' | column; } # columnで複数列に整形
# list naturally (numerically)
lsn() { command ls "$@" | sort -n | column; }
# tree -N: 日本語対応 -C: 着色 (colorized)
tree() { command tree -NC "$@"; }
# less -R: 着色対応、-N: 行番号表示、-M: スクロール位置表示、-i: --ignora-case; 検索時に小文字を使うと、大文字と区別しない
less() { command less -iNMR "$@"; }
# grep colored
grepc() { command grep --color=always "$@"; }

##### ディレクトリ移動 #####
# z というコマンドを入れると、ディレクトリ移動が楽になる。非常にオススメ
# https://github.com/rupa/z
# よりモダンなz.luaがおすすめ
# https://github.com/skywind3000/z.lua