ログイン
編集不可のページディスカッション情報添付ファイル
hatuyuki0224/unix講習

MMA

(この記事は /mizunashi_mana/UNIX講習, /kyontan/UNIX講習 をベースに手直ししただけです. )

コマンドの説明書を読もう

今, sshというものでコンピュータにリモートログインしてもらっています. sshというのは, Secure SHellという名から来ていて, 名前のとおりセキュアな「シェル」です(少しどころか大分語弊がありますが, きっとSSH講習はすごい人がやってくれるのでその人が誤解を華麗に解いてくれるでしょう).

つまり, 現在, nestのコンピュータの Unix OS上で「シェル」を起動していることになります.

「シェル」というのは何か?うーん, そうですね…….

コマンドを実行してくれるソフトウェアのことなのですが, 今はニュアンス的に現在の画面のことと捉えてください.

この画面ではいろんなコマンドを入力すると, いろいろなパソコンの操作ができます. 今は便利な時代なので, とてもたくさんのコマンドが用意されています.

あまりにも多すぎて, ちゃんとした使い方を全部覚えるのは大変です. なので, コマンドの一つに「コマンドの取扱説明書」を表示してくれる「manコマンド」が存在します.

まずは, 以下のようにコマンドを入力してみましょう. ここからは"username@nest:~$ "の部分は"$"と簡略して書きます.

説明書を閉じるには[q]と入力, 説明書は[j]か[↓]で下に移動, [k]か[↑]で上に移動させることができます.

$ man echo

説明が出てきました. 説明を読んだだけではちょっと実感しづらいと思うので, 以下のようなコマンドも入力してみましょう.

$ echo "Hello World"

echoというコマンドがどういうコマンドか分かったと思います. 他にもいろいろなコマンドが存在します. 下のコマンドをいくつか説明書を読みながら試してみましょう.

  • manコマンドの使い方
$ man [コマンド名]
  • 様々なコマンド
alias  bash   cat    cd     cp     echo   emacs  find   gcc    grep   less   ls     make   man    
mkdir  mv     nano   passwd pwd    sed    sl     sort   ssh    tar    tr     unzip  vi     vim

環境変数

Unix には(というと語弊がまた生じますがまあいいでしょう), 環境変数というものがあります.

何のために存在するのか……というのはひとまず置いておいて, どういうものか見てみましょう.

下のコマンドを実行してみましょう. 一行目を入力すると, 結果が出るはずです. それで問題ないので(完璧に下と同じようになるわけではないので)一行ずつコマンドを入力してください.

$ echo $a
$ echo $SHELL

片方は何も表示されず, もう片方はなにか表示されたと思います. 表示された方を環境変数といいます.

他にも環境変数がたくさんあります. ちょっと探していろいろ表示してみましょう. 環境変数は全部大文字です.

(Wikipediaとかに書いてあったりね?)

以下から, Unix 講習用スライド資料

はじめに

  • この講習は, nestに接続してもらうことを前提にしています.
  • macで同じことをしても動かない?
  • Windowsで同じことをしても動かない?
  • FreeBSDで同じことをしても動かない?
  • 知りません.
  • この講習は, Unix 初心者向けの講習なので知ってる人から見ていろんな語弊を含みます.
  • *しかも, 講習する人が初心者です. *
  • もし, 「完全に」間違っていることを言っていたら正してあげてください.
  • 講習中暇な人は, 問題集を解いておいてください.
  • ついでに, 完答しても何も得られません.
  • この講習は導入目的ですので, ちゃんとやりたい人はこの講習の内容に捕われずちゃんと後で勉強してください.
  • 分からない方がいたらいつでも手を挙げればきっとTAが駆けつけてくれます.
  • TAの人たちは問題解くのに夢中になって気づかないとかきっとないよね・・・?

Unixって何?

  • OSのこと(Windowsとか, Macとか)
  • 元はAT&Tのベル研究所で開発されたが, いろいろな団体が派生版(BSDとか)を作った.
  • 現在では, The Open Groupという偉い団体がUNIXと認めたもののみが「UNIX」を正式に名乗ることが出来, そうでないものも含めて「Unix系(Unixライク)」と呼ぶ.
    • とはいっても, Unix系(主にBSD系やLinux)含めてUnixと扱うことが多い. この講習内でも, まとめてUnixと扱っています.
  • 現在広く使われているOSは, WindowsとUNIXといっても過言ではない.

代表的なUNIX

macOS(Apple Inc.), AIX(IBM Corporation), HP-UX(Hewlett Packard Enterprise), Solaris(Oracle Corporation), SCO OpenServer(The SCO Group, Inc.)

代表的なUnix系OS

  • BSD(とその子孫)
    • FreeBSD
    • NetBSD
    • OpenBSD
    • DragonFly BSD
  • GNU/Linux
    • Debian系: Debian, Ubuntu, Linux Mint
    • Red Hat系: Red Hat Enterprise Linux, Fedora, CentOS
    • Slackware系: Slackware, SUSELinux
    • 独立系: Arch Linux, Gentoo Linux
  • その他

Linuxって何?

  • Linus TorvaldsがUnixを参考にして作ったOS.
  • なんでLinuxなのにDebianとかUbuntuとかいろいろあるの?
  • 狭義の意味ではLinuxは「Linuxカーネル」(OSの中核部分)のみを表す.
    • 1つのOSとして個人が使える形にして頒布したのがLinuxディストリビューション.
    • それぞれのディストリごとに特徴がある.
  • 一般的には広義の意味で, 「Linuxカーネル」を用いたシステムのことをLinuxと呼ぶ.
  • Linuxも普通「Unix系(Unixライク)」に含まれます.

とりあえず, Unixに触れてみる

まずは, nestに接続しましょう.

username@nest:~$

こういう画面が出たら, lsと打ってEnterを押す. 何か出てきたらそのまま待つ.

username@nest:~$ ls
Maildir
username@nest:~$

次のスライドからいちいち"username@nest:~$"と出すのはだるいので, "$"と出します.

 (username@nest:~$ ls) == ($ ls)

OSの構造

カーネル

  • OSの中核. コンピュータのハードウェア部分(CPU, メモリなど)とソフトウェア部分(ユーザーが操作によって実行するもの)をつなげる.
  • とても基本的な機能(キーボードのどのボタンが押されたかを伝えるなど)を提供し, また様々なものを「管理」してくれる.
  • キーボード入力の場合:カーネルでキーボードからの入力(「あるボタン」が押された)を伝え, それをOSが換字(「a」が押された)してくれる. そしてさらにIME(アプリケーション)が変換(「あ」が入力された)してくれる.

シェル

  • ユーザーがカーネルにアクセスする(プログラムを実行する)ために用意されたもの.
  • プログラムの動作を管理する機能を備えている. 多くの場合, コマンドを実行して動作を確認するために使われる.
  • Windowsのエクスプローラ(メニューやタスクバーも含む)やMacのFinder, GNOMEもシェルの一つ. (グラフィカルシェルと呼ばれる)
  • 以下を実行すると今使用しているシェルの名前が見える.
$ echo $SHELL

コマンド

  • シェルはコマンドラインインタプリタ(コマンドを解釈し動作させるプログラム)とも呼ばれる.
  • コマンドは, カーネルにアクセスしやすくするための命令群
  • 実際にコマンドで動くのはプログラムで, そのプログラム名がコマンド名と同一であることが多い.
$ echo -n              "Hello, World!"
  本体 フラグ(オプション)  引数

ファイル操作とファイル構造

ファイルにはデータが保存されている. データの種類によって音楽ファイルや動画ファイル, 文書ファイル, プログラムファイルなどがある.

様々な情報がOSで管理されている.

ディレクトリ

~ 
├── test1
│   ├── ks
│   └── test1document.txt
├── test2
│   └── test3
│       └── testdocument.txt
├── testdoc2.txt
└── testdocument.txt
  • ファイルやディレクトリを分類しやすいようにするもの.
  • フォルダーということもあります.
  • 階層的になっていて, ディレクトリの中にファイルやディレクトリをしまいこむことができる
  • もともと名前が決まっているディレクトリもある.
  • ルートディレクトリ( / )
    最上位(根:ルート)のディレクトリ
  • ホームディレクトリ( ~ )
    シェルが立ち上がった時に入るディレクトリ
  • カレントディレクトリ( . )
    シェルで現在いるディレクトリのこと
  • 親ディレクトリ( .. )
    カレントディレクトリが属しているディレクトリのこと

パス

  • 住所のようなもの.
  • ファイルがどの階層にいるかを文字列で表す. そのファイルに行き着くまでに通るディレクトリをスラッシュでくくって表す.
  • /opt/local/bin/ks <ルートディレクトリ→optディレクトリ→localディレクトリ→binディレクトリ→ksファイル> [絶対パス]
  • /usr/share/dict/words <ルートディレクトリ→usrディレクトリ→shareディレクトリ→dictディレクトリ→wordsファイル> [絶対パス]
  • /./bin/../bin/ls <ルートディレクトリ→カレントディレクトリ(ルートディレクトリ)→binディレクトリ→親ディレクトリ(ルートディレクトリ)→binディレクトリ→lsファイル> [絶対パス]
  • ../moba/ <親ディレクトリ(自分のホームディレクトリが属しているディレクトリ)→mobaディレクトリ> [相対パス]

相対パス

  • カレントディレクトリからたどってそのファイルに行き着くまでに通るディレクトリでパスを表したもの.
  • 住所で例えるなら, 自分が今いるところが東京都なら, 港区台場一丁目.

絶対パス

  • ルートディレクトリからたどってそのファイルに行き着くまでに通るディレクトリでパスを表したもの.
  • 住所で例えるなら, 日本国東京都港区台場一丁目.

lsコマンド, cdコマンド, pwdコマンド

lsコマンド

ディレクトリの情報を表示します. (list)

オプション

  • -a:全てのディレクトリを表示
  • -F:ファイルタイプをつけて表示
  • -l:詳細情報をつけて表示
  • -t:ファイルの更新日時順に表示
  • -r:逆順にして表示

引数

  • なし:カレントディレクトリの情報を表示
  • ディレクトリパス名:指定された名前のディレクトリを表示

cdコマンド

カレントディレクトリを変更します. (change directory)

引数

  • なし:ルートディレクトリにカレントディレクトリを変更
  • ディレクトリパス名:指定された名前のディレクトリにカレントディレクトリを変更

pwdコマンド

現在のカレントディレクトリのパス名を表示します. (print working directory)

catコマンド

ファイルを表示する. (catenate, concatenate)

オプション

  • -n:行数を左につけて表示

引数

  • なし:入力したものをそのまま表示する.
  • ファイルパス名:指定された名前のファイルを表示

リダイレクト

リダイレクトとは, 入出力の方向を変えることを意味する. 具体的には処理結果の出力先を画面からファイル(への書き込み)に切り替えたり, 入力元をキーボードからファイル(からの読み出し)に切り替えたりすることである. リダイレクトを用いると, コマンドの処理結果をファイルに書き込んだり, 処理結果のリスト・ファイルを作成したりできる.

  • Linuxコマンド逆引き大全
  • :出力のリダイレクト(上書き)

  • :出力をファイルに追記する(ファイルの更新)

  • <:入力のリダイレクト
  • <<:入力終端文字列を指定する

hoge.txt

Hello, World!
$ cat >> hoge.txt
Nice to meet you.
^D

hoge.txt

Hello, World!
Nice to meet you.

mkdirコマンド

ディレクトリを作る. (make directory)

引数

  • ディレクトリパス名:指定された名前のディレクトリを作る.

cpコマンド, mvコマンド

cpコマンド

ファイルをコピーする. (copy)

オプション

  • -r:再帰的にファイルをコピーする. (ディレクトリ名を引数指定された場合, ディレクトリの中のファイル群全てコピー)

引数

  • パス名2つ:一番目のパス名で指定されたファイルまたはディレクトリを, 二番めのパス名で指定されたファイルまたはディレクトリにコピー

mvコマンド

ファイルを移動する. (move)

オプション

  • -i:上書きする場合確認する.

引数

  • パス名2つ:一番目のパス名で指定されたファイルまたはディレクトリを, 二番目のパス名で指定されたファイルまたはディレクトリに移動

rmコマンド

ファイル/ディレクトリを消す. (remove)

オプション

  • -r:再帰的にファイルを削除. (ディレクトリ名を引数指定された場合, そのディレクトリとディレクトリの中のファイル群全て消去)
  • -i:消す前に確認してくれる.

引数

  • パス名:指定されたファイルまたはディレクトリを消去.

ユーザー

  • 利用者ごとにアカウントというものが発行されます.
  • ユーザはそれぞれグループというものに所属します.
  • ファイルやディレクトリにはそれぞれどのユーザー/どのグループのものかという情報が存在しています.
  • rootという特別なユーザがいます.

グループ

  • それぞれが権限などの情報を管理している.
  • Unixの中でもOSで管理の仕方が違うことも.
  • 特別なグループ
    • sudo,wheel,admグループなど

自分の所属しているグループが表示される.

$ groups

権限とchmodコマンド

ファイルごとに3種類の権限(パーミッション)が存在する. さらに, それぞれ権限の種類がわかれていて, 全部で9種類の権限がある.

自由に権限を変えられるのはそのファイルを所有するユーザーだけ.

ugo権限

  • u(user): そのファイルを所有しているユーザーの権限
  • g(group): そのファイルが所属するグループの権限
  • o(other): それ以外の人たちの権限

rwx権限

  • r(read): 読み込み権限. コピーとか読むとかができる.
  • w(write): 書き込み権限. 削除とか移動とか書き換えとかができる.
  • x(executable): 実行権限. 実行とかができる. ディレクトリだとディレクトリにカレントディレクトリを変更することができる.

chmodコマンド

ファイルのパーミッションを変更する. (change mode)

引数

  • 権限・パス名:パス名のファイルを指定された権限に変える.

    • userにread権限だけを付加する.
u=r
  • groupにwrite権限と実行権限だけを付加する.
g=wx
  • otherにread権限とwrite権限だけを付加する.
o=rw

パイプ

あるコマンドの出力を別のコマンドに入力させる方法.

パイプライン("|")を使ってやる.

lsコマンドの出力に, 例えば行番号を付けたい場合

$ ls | cat -n

ほとんどの基本的なコマンドはパイプで繋げられることを前提として作られている.

このようなコマンドをフィルタという.

manコマンド

マニュアルを表示する. (manual)

オプション

  • -k:キーワードに関連するコマンドを探す.
  • -f:マニュアルの要約を表示する.

引数

  • コマンド名ORキーワード:指定されたコマンド名のマニュアル表示

コマンド説明

  • その他のコマンド
  • more, less コマンド
  • ln, rmdirコマンド
  • fg, bg, jobsコマンド
  • vi, vim, emacsコマンド
  • ping, ncコマンド
  • whichコマンド
  • chown, chgrp, chshコマンド
  • date, calコマンド
  • nkfコマンド
  • sedコマンド
  • testコマンド
  • tar, zip, unzipコマンド
  • whoコマンド
  • touchコマンド
  • historyコマンド
  • diffコマンド
  • xargsコマンド
  • cut, uniqコマンド
  • wcコマンド

なんで Unix なんて使うの?

趣味

Windowsでいいやん!全て解決.

僕もそう思う

  • Unix がなぜ使われるかは, Unix OSがたくさんあることと関係している.
  • それから, 安いという理由で利用されることもある.
  • 一括りには言えない.

  • Unix を作った人たちの考え方が大きく関係している.

UNIX哲学

This is the Unix philosophy:
Write programs that do one thing and do it well.
Write programs to work together.
Write programs to handle text streams, because that is a universal interface.
 - 1つのことをし, それをうまくこなすプログラムを書け. 
 - 協調して動くようなプログラムを書け. 
 - テキストストリーム(標準入出力)を扱うプログラムを書け. なぜなら, それは普遍的な入出力装置だからだ. 

これこそが, UNIX哲学である.

参考

hatuyuki0224/unix講習 (最終更新日時 2017-05-17 15:54:46 更新者 hatuyuki0224)