(演習)UNIXのシェル

目次

準備

シェルコマンド

基本コマンド

プロセス操作

psは現在稼働中のプロセスの状態を示し,killはそれを強制終了するコマンドである.

  1. サーバにログインしたウィンドウを2つ作り,片方で下記のようにタイプしなさい。
    ping www.tamagawa.ac.jp.
  2. 動き続けているpingは[Control]+[C]でとめられるが,これをもう1つのウィンドウから止めてみよう.
  3. もう一つのターミナルウィンドウから,下記のように入力しなさい。
    ps -x
  4. このなかにpingというのがあるはずなので,そのPID (プロセスID)を覚えて下さい.
  5. pingのPIDがたとえば12345なら,下記のようにタイプしてみなさい。
    kill 12345

ワイルドカード

シェルのコマンドラインでは、ファイル名を指定するときにワイルドカードが使える。 ワイルドカード「*」と「?」の意味について調べなさい。

リダイレクトとパイプ

シェルコマンドは「|」(縦棒)で接続し、前のコマンドの出力を次のコマンドの入力に流し込むことができます。 これをパイプ(パイプライン)と呼ぶ.たとえば,

ls -l | more

とするとls -lの結果を1ページずつ止めてみることが出来る.

また、リダイレクト「>」を用いると、コマンドの出力結果をファイルに書き出すことができる。たとえば,

ls > tako

とすると,lsの結果をtakoというファイルに書き込んでくれる。 逆に「<」を用いると、ファイルの内容をコマンドの入力にすることもできる。

シェルスクリプト

シェルスクリプトとは?

シェルにおける一連のコマンド操作をプログラムとしてファイルに記録しておき、あとで再現する(実行させる)ことができる。 たとえば、以下のような手順でシェルスクリプトを作成する。

  1. テキストエディタで、以下の内容のファイルを作成する。
    #! /bin/sh
    echo "---start---"
    ps -aux | grep X
    echo "----end---"
  2. このファイルを、psxという名前で保存する。
  3. 次のようにタイプして、psxを実行可能にする。
    chmod 755 psx
  4. psxを実行する。何が起こるか?
    ./psx

つまり、以上のようにすると、コマンドラインで「./psx」と打つことで、「ps -aux | grep X」と打ったのと同じ効果が得られる。このように、シェルでよく行う手順をあらかじめ記録しておくのがシェルスクリプトである。

なお、1行目の「#! /bin/sh」はシェルスクリプトを実行するシェルを指定するもので、必ずこのように書くこと。

シェル変数

シェルスクリプトの中では(中でなくても)、変数を使うことができる。

制御構造

シェルスクリプトの中では、各種制御構造が使える。

演習課題

【問1】 下記のコマンドの役割を調べ,それぞれ1つ以上の使用例を示しなさい。

  1. ls
  2. pwd
  3. cd
  4. mkdir
  5. rmdir
  6. cp
  7. rm
  8. mv
  9. ln
  10. chmod
  11. cat
  12. head
  13. sort
  14. grep
  15. find
  16. who
  17. passwd
  18. ps
  19. kill
  20. history

【問2】 以下のコマンドが、それぞれ何をしているのか調べなさい。不明なコマンドはmanコマンドなどで調べること。

  1. echo Hello! > hello.txt
  2. ps -ef | more
  3. ps -ef | grep root > ps-root.txt
  4. find /etc -name "*tab" -print
  5. cat *.txt > goodbye.txt

【問3】 以下のような操作を実現するシェルコマンドを示しなさい。

  1. ホームディレクトリの下に、「os2006」というディレクトリを作成するシェルコマンド。
  2. 現在コンピュータで動いているプロセスの一覧を、ユーザ名の順番で並べ替えるシェルコマンド。1画面ごとに表示させるのが好ましい。
  3. ディレクトリ「/usr/man」とそのサブディレクトリの中から、「g」で始まるファイルをすべて探し出して列挙するシェルコマンド。数が多い場合には、1画面ごとに表示させるのが好ましい。
  4. コマンド「du」を用いると、指定したディレクトリとそのサブディレクトリのディスクの使用量が分かる。「du」の出力を大きい順に並べ替えるシェルコマンドを示しなさい。これも、1画面ごとに表示させるのが好ましい。
    • du の使用例
      du /usr/lib

発展課題

【問4】 以下のような動作をするシェルスクリプトを作成しなさい。

以下のような手順を実現するシェルスクリプトを作成しなさい。

  1. 画面に「Hello!」と表示するシェルスクリプト。
    • 実行例
      $ ./hello        ← たとえば hello という名前のシェルスクリプトにした。 
      Hello!   ← 実行結果。
    • ヒント: echo
  2. コマンド引数で指定したディレクトリに、C言語のソースファイルがあるか調べるシェルスクリプト。
    • 実行例
      $ ./findc prog  ← prog というディレクトリを調べる。
      prog/test1.c    ← 実行結果。見付かったファイルが列挙される。
      prog/test2.c
      prog/test3.c
    • ヒント: find, 引数の取り出し($1)
  3. キーボードからの入力を求め、それが「L」だったら「LEFT」、「R」だったら「RIGHT」と表示するシェルスクリプト。
    • 実行例
      $ ./asklr       ← シェルスクリプトの実行。
      Input L or R ?  ← 「L」か「R」を入力するように要求してくる。
      R               ← ユーザが「R」と入力。
      RIGHT           ← 結果表示。
    • ヒント: read, if
  4. コマンドの引数で与えられた複数の文字列をたてに表示するシェルスクリプト。
    • 実行例
      $ ./vecho yamada takeuchi nakamura shiozawa gogo!
      yamada
      takeuchi
      nakamura
      shiozawa
      gogo!
    • ヒント: for, 引数の取り出し($*)

【問5】 以下のような動作をするシェルスクリプトを作成しなさい。

  1. コマンド引数で与えられたファイルを、誰からも読めなくするシェルスクリプト。
    • 実行例
      $ ./secret himitsu.txt
  2. C言語のソースファイル(拡張子が .c のファイル)を全部つなげて、1つの大きなテキストファイルにするシェルスクリプト。
    • 実行例(リダイレクト(>)が不要にしてもよい)
      $ ./cmerge > cfiles.txt
  3. 「Hello!」と表示するシェルスクリプトを改良して、自分のホスト名(コンピュータ名)を表示するシェルスクリプト。
    • 実行例
      $ ./hi
      Hi! My name is a01.cad.eng.tamagawa.ac.jp.
  4. ユーザが「stop」と入力するまで、時刻を表示し続けるシェルスクリプト。
    • 実行例
      $ ./dateloop                          ← シェルスクリプトを起動すると、
      2005年  5月 11日 水曜日 11:44:01 JST  ← 時刻を表示して入力待ちになる。
                                            ← ただ [Enter] を押したり、
      2005年  5月 11日 水曜日 11:44:05 JST
      aaaa                                  ← 適当な文字や、
      2005年  5月 11日 水曜日 11:44:36 JST
      123                                   ← 適当な数字を入れると続行する。
      2005年  5月 11日 水曜日 11:44:40 JST
      stop                                  ← 「stop」と入力すると終了する。
  5. コマンドラインで指定した月(複数)のカレンダを表示するシェルスクリプト。
    • 実行例
      $ ./mcal 4 5           ←コマンドの入力。4月と5月を指定。
           April 2005        ←以下、結果出力。4月と5月のカレンダー。
      Su Mo Tu We Th Fr Sa
                      1  2
       3  4  5  6  7  8  9
      10 11 12 13 14 15 16
      17 18 19 20 21 22 23
      24 25 26 27 28 29 30
      
            May 2005
      Su Mo Tu We Th Fr Sa
       1  2  3  4  5  6  7
       8  9 10 11 12 13 14
      15 16 17 18 19 20 21
      22 23 24 25 26 27 28
      29 30 31

参考資料

以上


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-11-09 (木) 10:22:20