Lesson7 標準入出力を理解する

1.標準入出力・リダイレクション・パイプ

標準入出力


図1 標準入出力の切り替え

リダイレクション

(1)標準出力をファイルへ切り替え

コマンド > ファイル
例.          date >  aaa (コマンドdateの出力をファイルaaaに保存する)

(2)標準入力をファイルからに切り替え

コマンド ファイル
例   cat  < aaa  ( cat aaaと同じ

(3)標準エラー出力をファイルに切り替え
出力のうちでも、エラーメッセージは、標準出力とは別の標準エラー出力に 出力されます。デフォルトでは、どちらの出力も画面となっているので、見分けが付きませ んが、下記のような形式で、エラー出力だけ をファイルに切り替えることができます。

コマンド 2>  ファイル
例   
%cat  ddd   2>  error.out
%cat error.ou

   


図2 標準エラー出力の切り替え

標準出力もエラー出力も同じファイルに出力したい場合には下記のようにします。

cat ddd > out.d 2>&1          (標準出力もエラー出力out.dというファイルに出力
               2>&1の部分にはスペース を入れないように

補足
"コマンド  > ファイル" では、新しいファイルが作成されてコマンドの出力がファイルに書き込まれる。すでに存在しているファイルへの上書きや追加書きをするには下記のようにする。

    上書き(それまでに書き込ま れていたファイルの内容は消える!)
            コマンド >!  ファイル

    追加書き
            コマンド >>  ファイル

注意:教科書では上記のようになっていますが、実習に使用しているシステムでは、
”コマンド > ファイル”が実行されたとき、ファイルがすでに存在すると上書きがされるようになっていま す。コマンド >!  ファイル, コマンド >>  ファイル の使用法については同じです。

パイプ

パイプと呼ばれる記号を 使用して、 コマンドの 出力を、直接他のコマンドの入力にすることができます。
あるコマンド1の出力を別のコマンド2の入力とするには、下記のようにします。

コマンド1 | コマンド2


       例 ls |  sort   ファイルのリストを出力してそれをアルファベット順に並べ替える
      (sortはアルファベット順にファイルや入力をアルファベット順に並べ替えるコマンドです)


2つにかぎらず、次のようにどんどんつなげていくことができます。  

コマンド1 | コマンド2 | コマンド3 ・・・


コマンドの連続実行

コマンド1 ; コマンド2

この場合は順番にコマンド1、2が実行されるだけです。コマンド1の出力はそのまま画面に出ます(コマンド2には入りません)。

2.デバイスファイル

デバイスファイルには下記のようなものがあります。

デバイスファイル デバイス(実体)
/dev/ttyp1 (ttyp2,...) モニタ(MacOSのターミナルでは /dev/ttys000, /dev/ttys001, ....)
/dev/fd0
フロッピー
/dev/null
ヌ ルファイル【何も出力しない仮想ファイル→出力のゴミ箱として使える


 
cat aaa > /dev/ttys000        
(aaaのファイルの中身をモニタにリダイレクションする cat aaaと同じ動作)
 
cat ddd 2> /dev/null          
(エラー出力をヌルファイルに出力する→エラーを出力しないようにする)

ちょっと実験

  • 2つターミナルをあける。
  • 各ターミナルの上で、マウス右ボタンをおして、"インスペクタを表示”を選択して、TTY: の後ろの使用されているデバイスファイル名を確認(例 /dev/ttys000)
  • /dev/ttys000のターミナルで以下を実行してみる。

% ls
% ls > /dev/ttys000 
% ls > /dev/ttys001 (別のターミナルのデバイスファイル名。異なっている場合は適宜変更のこと)

  • なにがおこったでしょうか。

補足:フィルタ

テキスト入力に対して解析や加工を行い、その結果をテキストで 出力するコマンドを”フィルタ”と 呼びます。 フィルタには 次の ような ものが あります。
 
コマンド名
機能
使用例
more  データを1画面ずつ表示する。
more ファイル名
grep  特定のパターンを探す。grep パターン名 ファイル名
head  ファイルの先頭だけを表示する。
head ファイル名
tail  ファイルの末尾だけを表示する。tail ファイル名
sort  アルファベット順に行を並べ変える。sort ファイル名
spell  スペルチェック
spell ファイル名
sed  テキストの編集
例  sed   s/A/a/g  ファイル名:  ファイル内の"A"をすぺて"a"に置き換える

Lesson 8 エディタを使ってみる


教科書の内容にしたがって、vi エディタの使用法をマスターしましょう。
慣れるまで大変ですが、UNIXのシステム管理者には必須のスキルです。

STEP1

教科書の説明をよんで例題を実施してください。
スクリーン上でも動作をやってみますのでよくみて習得してください。
その他、教科書のviのまとめを参考にしてください。

STEP2

これまで何度か説明しましたが、下記の方法 でも、ファイルを作成することができます。
ここではファイル名は新しい(現在存在しない)ものである必要があります。

cat  > ファイル名
(このあと文字入力)
(最後にcntlキーと Dキーを同時に押して編集修了)

なお教科書にはありませんが、少し違う使い方を紹介しておきます。
cat  >! ファイル名                  (すでに存在するファイルを上書きする。古い内容は消える)
cat >> ファイル名       (すでに存在 するファイルの後ろに追加編集を行う。)

また、ファイルの作成には、ドックにあるテキストエディタも利用することができます。

課題7-8

締め切り  2016/11/10 17:00
配点
1 1-8       各9点
2          8点
3 1-2   各7点
4               3点
5               3点

問題
  1. 以下の操作を実行してください。(まず cd d7を行っておくものとする。) 
    1. 現在のディレクトリにあるファイルの一覧(属性情報付き)を、ファイル f71 に出力する。
    2. 現在の日時をUTCで、ファイル f71 の後ろに追加書きする。その後さらに現在の日時をJSTで、ファイル f71 の後ろに追加書きする。
    3. ファイル f71 の内容を確認する。
    4. 今月のカレンダーを、ファイル f71 に上書きする(以前の内容は消える)。
    5. ファイル f71 の内容を確認する。
    6. わざとエラーを発生させて(たとえば cat f79 (存在しないファイル) など)、このときの標準エラー出力を ファイル f72 に直接出力して保存する。
    7. ファイル f72 の内容を確認する。
    8. 6と同様にわざとエラーを発生させるとき、標準エラー出力を画面に表示させないようにしてください。(ファイルに入れる必要はありません。ヒン ト:ヌルファイル)
  2. /etc にあるファイルとディレクトリの数を数えてください(1行のコマンドで実施してください)。 (ヒント参照)。
  3. あなたの知人の名前 (First name) を ローマ字でアルファベットで10人分、 friends というファイルに 書きなさい(テキストエディタを使用してさい)。このとき、アルファベットででたらめな順番になるようにしなさい。
    1. フィルタコマンド(このページの補足参照)を使って この 名前を アルファベット順に 整列させてください。
    2. 3.1の結果を直接"friends_new"というファイルに保存させてください(1コマンドで)。
  4. 以下の作業を”viで”行ってください。作業内容を簡潔に説明してください。
    1. 次の内容のファイル f81(d7の中で結構です) を作ってください。
      Akira likes beef.
      Kaoru likes vegetables.
    2. ファイル f81 を f82 にコピーしてください。
    3. f82 の 2 行目に次を挿入してください。
      Jun also likes beef.
    4. f82 の 3 行目の vegetablepork に変えてください 
  5. ”cat コマンド”を使ってf82の最後に次の行を加えてください(ヒント:オンラインテキスト8のSTEP2の補足参照) 
Others don't like pork.

2番のヒント

wc コマンド

機能:フィルタコマンドの一種で、入力ファイル中の行数、単語数、文字数を答える
使用方法    
  wc ファイル名
      コマンド | wc 

   man  で調べてみよう。

例:
% date > aaa
% cat aaa
   金 11 17 15:15:47 JST 2006
% wc aaa
       1       6        28           aaa
    (行数 単語数 文字数)

      (aaaというファイルは1行、6単語、28文字(空白含む)を含む.)

フィルタを使用して以下のとおりでも同様の動作をする。
date | wc