(教材)07【シェルの便利な機能】
シェル (bash) には,ただコマンドをカーネルにわたすだけではなく,ユーザの利便性を考慮した機能が数多くある. 第3回で紹介した履歴 (history) 機能はその一つである.
教科書には書かれていないが,ここでは「これを利用すれば格段に作業効率がよくなるだろう」機能を紹介しよう.
※ここで紹介するのは,"bash"の機能である.もしほかのシェル,zsh,tcsh などを使う場合も,似た機能はある.が,それぞれに独自の操作がある.
☆ヒストリ ( 履歴 ) 機能
すでに第3回で紹介したので,↑キーなど,それなりに使っている人もいるかと思う.
ヒストリ操作は矢印キーだけではない.以下を参考に,より便利に使えるようになろう.
table:bashのhistory機能
キー/操作 機能
上矢印キー 直前のコマンドを復元( どんどん遡る )
下矢印キー さかのぼり過ぎた履歴を進める
!!( 半角ビックリ×2 ) 直前のコマンドを復元(上矢印キー x 1)
history 100 履歴リストを100行表示(数字なしならすべての履歴)
!man manで始まる最後の履歴行を実行
↑ 例: nano hogehoge.txt▼ → 編集終了 → !na▼ で同ファイル編集
![数字] historyに表された履歴番号のコマンドを実行
矢印キーの履歴機能は手軽だが,履歴リストが長い場合,いつになったら目的の行に到達するかがわからない (延々と上矢印というのもアホらしい) .
直前の履歴ならまだしも,いつ入力したのか不明な場合は賢いやり方とは言えない.こういうときは,
a. コマンド名を覚えていたら, ![コマンド最初の数文字]▼
b. 最後に編集したファイルを再度nanoで開くなら, !na▼
c. コマンドがまったく不明,または同じコマンドで多くの実行をしている場合,
→ history | less▼ で履歴番号確認 → "![履歴番号]"
以下に参考リンクを紹介しておく (第3回で既出のものも含める)
★historyの使い方全般:
▲▲けっこう読みやすいかも
▲▲教科書的
▲▲けっこうディープ
★historyのカスタマイズ方法:
▲▲ 結構熱く語っている.WSL端末では効かな いショートカットもある (C-rとか)
☆ファイル名補完
Unixはファイル名にあまり制限がない.半角空白は使えないが, ものすごく長い名前のファィル名もOKだし,"." (半角ドット) をいくつも使えたりする.
(例:"aa.bb.ccc.dddd.eeeee")
しかしそういう長い名前や複雑な綴りのファイルを指定するのは手間だし間違えやすい.
コマンドも同様で,短いものなら忘れないが,なかなか覚えにくい長いコマンドもある.
"ypdomainname", "select-default-iwrap"
← どんなコマンドか調べるべし
そういう人のために,シェルはファイル名やコマンド名を補完してくれる.
※厳密に補完されるのはカレントディレクトリにあるファイルか,または実行パスの通った場所にある実行ファイル
table:ファイル名補完
Tabキー 最初の数文字 → TAB → その文字で始まるファイル名を補完
たとえば,カレントディレクトリに以下のファイルが存在したとする.
code:▼はEnter,■はプロンプト
$ ls -1▼
aaaaaaaaaaa.txt
abcdeeee.txt
bbbbbbbb.txt
$ ■
以下に補完機能がどう働くかを見よう.(▼はEnter,■はプロンプト)
code:ケース1
<bbbbbbbb.txtを指定したい>
$ ls bTAB ⇒ bbbbbbbb.txt と補完表示 $ ls bbbb.txt▼ ← こうなる.Enterで実行.
bbbb.txt
$ ■
code:ケース2
<aaaaaaaaaaa.txtを指定したい>
$ ls aTAB ⇒ aで始まるファイルは複数あるからTAB 1回では表示しない aaaaaaaaaaa.txt abcd.txt ⇒ aで始まるリストが表示される
$ ls aaTAB ⇒ aを追加してTAB → すぐaaaaaaaaaaa.txtと補完表示 $ ls aaaaaaaaaaa.txt▼ ← こうなる.Enterで実行.
aaaaaaaaaaa.txt
$ ■
code:ケース3
<unitsを実行したいが "uni" しか覚えてない>
$ uniTABTAB ⇒ TAB 2回でuniから始まるコマンドを検索 unifdef unifdefall uniq units
$ unitTAB ⇒ 上のリストを見て,tを追加してTAB $ units▼ ⇒ すぐに ts が補完 → Enterで実行
( 以下略 )
☆ディレクトリ一時移動
cd コマンドでカレントディレクトリを変更し,いろんな場所 (ディレクトリ) に移動することはすでに学んだ.
しかし,「ちょっとだけ移動して,すぐに今のディレクトリに帰ってきたい」ということがよくある.こういう時に便利なシェルコマンドがある.
table:ディレクトリ一時移動
pushd [Dir] 一時的にDirに移動する
popd 直前にpushdした場所から戻る
dirs 一時移動を何回しているかを表示する
pushd/popdを使った例を見てみよう.
code:▼はEnter,■はプロンプト
$ pwd▼ ⇒ いまのディレクトリを確認
/home/y210999
$ pushd /tmp▼ ⇒ /tmpに一時移動するぞ
/tmp ~ ⇒ 今いる場所が左側,右側は元の場所(~はホームの意)
$ pwd▼ ⇒ 確認すると……
/tmp ⇒ たしかに/tmp
$ pushd /var/log▼ ⇒ さらに一時移動
/var/log /tmp ~ ⇒ 左から場所のスタックが表示
$ popd▼ ⇒ 一つ前の移動元に戻るぞ
/tmp ~ ⇒ スタックが減った
$ pwd▼ ⇒ 確認すると
/tmp ~ ⇒ 同じものが表示(当り前)
$ popd▼ ⇒ もう1回
~ ⇒ スタックは一つに
$ pwd▼
/usr/home/t00999 ⇒ 確かに戻っている
$ ■
上の例にもあるように,pushd は後入れ先出し (FIFO) スタック として働くので,多重に移動することができる.
pushd を多用すると,もともとどこから来たのかわからなくなる.そういう時には dirs コマンドを使う.
pushd を使っていてディレクトリスタックが多くなりすぎて「もういいや」となったら,dirs -c でスタック情報をクリアできる.(popdは効かなくなる)
☆alias ( 別名定義 ) 機能
Unixのコマンドにはたくさんのオプションがある.覚えるのはよく使うものだけでよいのだが, それでもオプション付きでしょっちゅう使う――つまり呪文的に定形文として利用する場合は,だんだん入力が面倒になってくる.
例:ls -Flagとかps -aux,sudo apt -y installなど
こういう時は,オプションごとひとまとめにして登録し,コマンドのように呼び出して使えると便利だ.これを実現するのが,「alias (エイリアス:別名 ) 機能」だ.
table:alias機能
名称 書き方 説明
alias alias [新コマンド] = '登録コマンド行' 新コマンドを登録
unalias unalias [エイリアス] エイリアスを解除
※登録したいコマンド行の表記を シングルクォートで囲む
ひとつのコマンドに複数のオプションを追加したり,パイプでつなげた長い1行コマンドを呼び出したり,使い道はいろいろだ."ls" を例にしてやってみよう.
code:alias<ls をいろいろオプション付きで定義>
$ alias lsf='ls -F'▼
$ alias lla='lsf -la'▼ ◀◀ aliasしたコマンドを登録に利用できる
$ alias l1='lsf -1'▼ ◀◀ わかりにくいが"エルいち"
$
code:<実行してみる>
$ lsf▼ ⇒ -F オプションで実行(ファィル種類表示)
Bakup/ Report/ Work/ exec.sh* fileA.txt
⇒ ファイル名最後: / → ディレクトリ,* → 実行属性
$ lla▼ ⇒ -Fla オプションで実行
drwxr-xr-x 2 fujii fujii 4096 7月 4 18:13 Backup/
drwxr-xr-x 2 fujii fujii 4096 7月 4 18:13 Report/
drwxr-xr-x 2 fujii fujii 4096 7月 4 18:13 Work/
-rwxr-xr-x 1 fujii fujii 0 7月 4 18:13 exec.sh*
-rw-r--r-- 1 fujii fujii 0 7月 4 18:13 fileA.txt
$ l1▼ ⇒ -F1 オプションで実行
Backup/
Report/
Work/
exec.sh*
fileA.txt
$
code:<aliasを解除する>
$ unalias lsf lla l1▼ ⇒ 上のエイリアス一括解除
$
code:<確かめる>
$ lsf▼
コマンド 'lsf' が見つかりません。 ⇒解除されてる
$
シェルプロンプト上で実行したaliasは,シェルを終了 (ターミナルを閉じる) すると消えてしまう.毎回使いたいaliasは,"$HOME/.bashrc" というファイルを編集し,その一番最後の行に,上の形式で追加しておく.
→ 次からターミナル起動時に自動でaliasを読み込み,利用できるようになる.
以下に,便利なaliasを紹介しておこう.どういう働きか,どう便利なのかは使って考えてみよう.
code:ちょっと便利なalias集
#以下を ~/.bashrc の最後に書き込み,再起動またはsource ~/.bashrc を実行 alias al = 'alias'
al ls='ls -F'
al l='ls -Flagh'
al cpr='cp -Rp'
al p='pwd'
al g='grep'
al m='less'
al hi='history'
al px='ps -aux'
al cl='clear;pwd;ls'
al nanorc='nano ~/.bashrc'
al rsc='source ~/.bashrc'
# 長いコマンドを短縮呼び出し
al dlist="tail -n 50 /var/log/dpkg.log|less"
※その他,「bash alias」でWeb検索すれば実用例がたくさん出てくる.
以上.
2023/7/4