はうすてんぼぶ

コードかいてて疑問に思ったことや、興味あることをつらつらと暇なときに書く場所、ここはそんな場所

Unixシェルコマンドの勉強 part 1

さて、何を隠そう、自分はUnixシェルの基本的操作すらおぼつかないので勉強がてらまとめとく。

はじめに

全4パートぐらいでひとまず基本的なコマンド周りを復習する。

対象は、
2 UNIXのコマンド http://akita-nct.jp/yamamoto/lecture/2006/5E/unix/html/node2.html
の「2.1 使用頻度の高いコマンド」に載ってた使用頻度の高いコマンド11個。

具体的には、

man, pwd, ls, cd, mkdir, rmdir, rm, cp, mv, cat, less

の11個。
part 1では、manpwdlsまで触れる

ちなみに、この記事のこの文を書いてる段階で自分が使える全Unixコマンドは、

cd, ls, rm, pwd, cp, mkdir, rmdir, chmod, man, which, grep

ぐらい。ちょっと死にたくなったけど頑張る。

使えるコマンドって言ってもそのほとんどが最低限しか使えてないので、調べつつ使ってみて、ここに書いてくよ。

参考資料は、ネットの海と、昔買った参考書「Amazon.co.jp: 改訂 新Linux/UNIX入門: 林 晴比古: 本」。

man

概要

マニュアルを表示する。
manualが語源

こんな感じに使う。

% man [name]
% man [n] [name]

[name]にコマンドを入れる。[n]を指定すると、マニュアルの第n章から探して表示してくれる。

例えばmanのマニュアルを見たい場合には、

% man man

実行結果は、

man(1)                                                man(1)

NAME
       man - format and display the on-line manual pages

SYNOPSIS
       man  [-acdfFhkKtwW]  [--path]  [-m system] [-p string]
       [-C config_file] [-M pathlist] [-P pager] [-B browser]
       [-H htmlpager] [-S  section_list] [section] name ...

マニュアルページは矢印キーでも動けるけど

  • [b] : back 前のページへ
  • [f][Space] : forward 次のページへ
  • [Enter] : 次の行へ
  • [q] : quit マニュアルを閉じる

ココらへんを覚えておくと便利!

オプション

とりあえず参考書に載ってた2つだけ。

-f

本格的に数ページに渡るマニュアルを読みたいわけでもないし…ってときは-fオプションを付けるとコマンドの意味を一行で知ることができる。

whatisでも同じ結果が得られる。また、結果を返すのもオンラインマニュアルからでなく、ローカルのDBから探す分whatisのほうが早いみたい。

% man -f [name]
% whatis man

実行結果、catが付くコマンドが複数あったので色々でてきてるけど、本来知りたいcatもその中にある。

% man -f cat
cat(1)                   - concatenate and print files
git-cat-file(1)          - Provide content or type and size information for repository objects
fc-cat(1)                - read font information cache files

何の省略表記はわからなかったので、first-lineと覚えとく。
findと紛らわしいかな…。

-k

-kオプションを使うと、正確なコマンドを忘れたときでも、コマンドの一部から、該当するコマンドを表示してくれる。コマンドだけを検索してるのではなく、一行説明文のとこからも探してくれるので便利!

aproposでも同じ結果が得られる。これもwhatisと同様の理由で、man -kとするより早い。

% man -k chmo
% apropos chmo

実行例。

% man -f chmo
chmo: nothing appropriate

% man -k chmo
chmod(1)                 - change file modes or Access Control Lists
chmod(2), fchmod(2)      - change mode of file
lchmod(3)                - change mode of file
~~~~ 省略 ~~~~

これも何の省略表記は分からないので、keywordとして覚えておく。

pwd

概要

カレントディレクトリを表示する。

語源は、print working directory

passwordとは無関係である。

使い方はシンプルで、ただ

% pwd

と打って実行するのみ。

実行結果は、こんな感じ

% pwd
% /Users/silent_bob

余談だけど、シェルの設定ファイルに現在地を常時表示するようにしとくとあまり使わなくなるコマンドな気がする。

zshを使っている今の自分の環境だと、

/Users/silent_bob% pwd
/Users/silent_bob

こんな感じになってるので、あまり使わないね。

オプション

pwdは、オプションは付けられない。

ls

概要

ディレクトリの内容を表示する。

「内容」というとちょっと分かりづらいが、要はディレクトリに入ってるファイルやらディレクトリを表示してくれるコマンド。

語源は、list segments。
listの短縮形かと思っていたらどうも違うみたい。

使い方は、

% ls [option] [path]

[option]は、-aのようなオプションが入る。
[path]は、内容を表示したいディレクトリへのパスを入れる、指定しなければカレントディレクトリのパスが自動的にそこに入る。

実行結果は、こんな感じ

%ls
Desktop  Music  Developer  Pictures  Documents
~~~~~ 省略 ~~~~~

lsでディレクトリの中身を見て、cdで別ディレクトリに移動したり、vimでファイルを開いたり、比較的起点になるコマンドなのかも。

オプション

実用的なオプションが他のコマンドに比べると、とても多い。
今のところ-A-lぐらいしか使ってない。

参考書に、主なオプションとして挙げられていたのは以下の10個。
実際はもっとあって気が遠くなる。

オプション 内容 語源
-a ドットファイルも表示("."から始まるファイル) all
-A -aと同じだが、"."と".."は表示しない All
-l ロング形式で表示(更新日やファイルサイズ、modなど) long
-F ファイル種類記号を付加 File (?)
-d ディレクトリの詳細情報を表示 directory
-t 最近更新された順に表示 times
-R サブディレクトリの内容も表示 Recursively
-1 1行にひとずつつ表示 1 line
-C 1行に複数表示(-1を指定しなければデフォルトで-Cになる) multi-Column
-h 合計サイズとファイルサイズを単位(M, K)付きの短い数字で表示 human readable

ここでは、教科書に載っていた複数オプションを使った例について取り上げる。
これ以外にも使いやすいオブションがあったら教えて下さい。

複数のオプション

といっても、教科書に載ってる例は全部何かに-lを加えたものしかなかった。

複数指定方法

別々にして記述する方法と、まとめて記述する方法がある。
これは別にlsに限った話じゃないだろうけどね!

下の2つの実行結果は同じ。

% ls -A -l
% ls -Al
-tl

更新時刻の新しい順に、詳細情報を表示してくれるオプション。

% ls -tl
total 360
-rw-r--r--@ 1 bob  OFFICE\Domain Users  35117  6 25 18:28 kikyo.png
-rw-r--r--@ 1 bob  OFFICE\Domain Users  66573  6 25 18:28 azarashi.gif
-rw-r--r--  1 bob  OFFICE\Domain Users  47554  6 25 17:39 cake.jpg
-rw-r--r--@ 1 bob  OFFICE\Domain Users  27405  6 23 20:29 caramel.jpg

使ってみたけど、使う場面はよくわかんなかった。

-Rl

サブディレクトリの内容を、詳細情報として表示してくれるオプション。

実行例は以下のようになる。

% ls -Rl
total 80
-rw-r--r--  1 bob  OFFICE\Domain Users    574  6 25 18:25 cake.css
-rw-r--r--  1 bob  OFFICE\Domain Users    510  6 26 13:24 cookie_page.html
-rw-r--r--  1 bob  OFFICE\Domain Users  28862  6 25 17:43 favicon.ico
drwxr-xr-x  6 bob  OFFICE\Domain Users    204  6 26 11:02 img
drwxr-xr-x  4 bob  OFFICE\Domain Users    136  7  3 17:48 secret

./img:
total 360
-rw-r--r--@ 1 bob  OFFICE\Domain Users  66573  6 25 18:28 azarashi.gif
-rw-r--r--  1 bob  OFFICE\Domain Users  47554  6 25 17:39 cake.jpg
-rw-r--r--@ 1 bob  OFFICE\Domain Users  27405  6 23 20:29 caramel.jpg
-rw-r--r--@ 1 bob  OFFICE\Domain Users  35117  6 25 18:28 kikyo.png

./secret:
total 8
-rw-r--r--  1 bob  OFFICE\Domain Users  509  7  3 17:48 index.html

再帰的に全部出力するからサブディレクトリが多いと表示結果がえらいこっちゃになるから注意。

んー、grepとかと相性がいいのだろうか、と思ったので、
あまり使いなれないgrepでhtmlファイルだけ検索してみた結果が下のようになる。

% ls -Rl | grep -E "*\.html$"
-rw-r--r--  1 bob  OFFICE\Domain Users    510  6 26 13:24 cookie_page.html
-rw-r--r--  1 bob  OFFICE\Domain Users  509  7  3 17:48 index.html

おお、おお?
でも、このままだとファイルの場所が分からないのか…。
うーむ、下の例みたいに権限での検索もできるけど、他のUnixシェルコマンドにないのかそういうの。

% ls -Rl | grep -E "^-rw-r--r--"
-rw-r--r--  1 bob  OFFICE\Domain Users    574  6 25 18:25 cake.css
-rw-r--r--  1 bob  OFFICE\Domain Users    510  6 26 13:24 cookie_page.html
-rw-r--r--  1 bob  OFFICE\Domain Users  28862  6 25 17:43 favicon.ico
~~~~~ 省略 ~~~~~

おわりに

とりあえず3つdone!
ちょっとずつ時間を見つけて書いてくよー。