いますぐ実践! Linuxシステム管理

[バックナンバーのトップへ] [Linux システム管理のトップへ]


いますぐ実践! Linux システム管理 / Vol.119 / 読者数:1153名

こんばんは、うすだです。

突然ですが、数日前、社長に叱咤されまして、そのとき、ぐわーんと響く言葉を、 二つほどいただきました。
(小さい会社ですので、社長と社員の距離はわりと近いのです。)

ひとつは、われわれはなにかを創り出しているのか、という問いです。
日々、ドライバや Linux のポーティングを行っているけれど、それは、 すでにあるソースを、少し変えて動かしているだけではないのか? という疑問からきています。(スクラッチで書くこともありますけどね。)

そして、もうひとつは、それが世の中に与える影響と、 それを作るために要した労力とは、何の関係もない、ということです。 とても当り前なことだと思いますが、技術者の立場から見た場合に、 そのことを忘れていたり受け入れがたかったりすることが、 よくあるような気がします。

わたくしごとで申し訳ございませんが、これは忘れちゃいけないと思い、 ここに書かせていただきました。

とくにオチはありませんので、今週も、はりきってまいりましょう。

今週のお題 - bash を自分好みに設定する / 魔宮の伝説

先週は、bash の設定方法のさわりを、ご紹介しました。

Vol.118 - bash を自分好みに設定する
http://www.usupi.org/sysad/118.html

しかし、エイリアスと環境変数だけで終わってしまいましたので、 今週はその続きを、さらりとご紹介したいと思います。


先週は、環境変数をひとくくりでご紹介しましたが、 bash の振る舞いが変わる環境変数がいくつかありますので、 少しご紹介したいと思います。

PS1〜PS4:
プロンプトの文字列です。どれが使われるかは状況によって異なりますが、 頻繁に使われるのは $PS1 です。たとえば、以下のように設定すると、 メインのプロンプトが "[コマンド番号]% " になります。
  export PS1='[\#]% '
PROMPT_COMMAND:
これを設定しておくと、$PS1 を表示する際に、毎回実行されます。 たとえば、xterm などのタイトルにカレントディレクトリを表示したいときは、 以下のように設定します。
  export PROMPT_COMMAND='echo -ne "\033]0;${PWD}\007"'
IGNOREEOF:
うっかり Ctrl+d を押してしまい、 期せずして bash が終了してしまうことがありますが、 $IGNOREEOF に数値を設定すると、その回数 Ctrl+d を押しても、 bash が終了しなくなります。たとえば以下のように設定すると、 5回までは無視してくれます。ちなみに、ignoreeof=5 でも、同じ効果が得られます。
  export IGNOREEOF=5
FIGNORE:
ファイル名を補完する際に、$FIGNORE に設定された文字列と、 候補のサフィックスが一致した場合、補完の候補から外されます。 普段は参照することのないファイルを指定しておくと便利です。たとえば、 以下を実行すると、*.bak や *.o は候補に含まれなくなります。
  export FIGNORE=".bak:.o"

また、$MACHTYPE や $HOSTNAME, $UID など、 bash が勝手に設定する環境変数もあります。 環境を区別するときなどに有用だと思いますので、 詳細はオンラインマニュアル(man bash)などで確認して、ご使用ください。

ちなみに、ログイン時や端末エミュレータ上で実行されたときなど、 対話的に bash が起動されたときには、$PS1 が設定されます。


では次に、関数をご紹介したいと思います。

エイリアスは便利ですが、引数をうまく扱うことができません。
そんなときに便利なのが、関数です。以下のように記述します。

  function 関数名() { 中身; }

function は省略可能で、いきなり関数名から記述しても OK です。
たとえば、ImageMagick の convert コマンドを用いて、 引数に指定した画像ファイルを GIF に変換する関数は、以下のようになります。

  function convert2gif() {
      for file in $*; do
          convert $file ${file%.*}.gif
      done
  }

$* は、引数全部を表します。これを、for 文で1つずつ処理しています。
${file%.*} は、$file を、 .* にマッチする最後のパターンを取り除いた文字列に変換したものです。 つまり、サフィックスを取り除いています。

上記を .bashrc などに書いて反映させたら、以下のように実行します。
うまくいけば、foo.gif と bar.gif が作成されます。

  % convert2gif foo.png bar.jpg

それでは、先週にひきつづき、.bashrc の例を、ご紹介します。

  # /etc/bashrc の読み込み
  [ -f /etc/bashrc ] && source /etc/bashrc
  # 対話的なときの設定
  if [ -n "$PS1" ]; then
      export IGNOREEOF=5
      export FIGNORE=".bak:.o:."
      case "$TERM" in
        *term*)
            export PS1='[\#]% '
            export PROMPT_COMMAND='echo -ne "\033]0;${PWD}\007"'
            ;;
        *)
            export PS1='[\# \W]% '
            unset PROMPT_COMMAND
            ;;
      esac
  fi
  # 関数
  function totrash() {
      for file in $*; do
          echo "$file: move to ~/.Trash"
          mv -i $file ~/.Trash/
      done
  }
  # エイリアスの設定
  alias a=alias
  a ll="ls -l"
  a la="ls -a"
  a s=set
  a f=fg
  a b=bg
  a tclean="rm -f ~/.Trash/*"

対話的に起動されたときに、いくつか環境変数を設定してみました。
端末の種類によって、$PS1 や $PROMPT_COMMAND の内容を変えています。
また、ゴミ箱へと捨てるための関数 totrash と、 ゴミ箱を空っぽにするエイリアス tclean を追加しました。


ところで、いちいち .bashrc に書いて試すのは面倒だなと思われた貴兄は、 適当なファイルに設定を書いて、以下のように実行してください。

  % cat tameshi.sh
  function convert2img() {
      suffix=$1
      shift
      while [ $# -ge 1 ]; do
          convert $1 ${1%.*}.$suffix
          shift
      done
  }
  % . tameshi.sh

. や source で、指定したファイルの内容を、 現在実行中の bash に反映させることができます。

上記の convert2img という関数は、先ほどの convert2gif を、 少し汎用的にしたものです。ただ、先の関数とほぼ同じ中身ではつまらないので、 ちょっと方法を変えてあります。
($1 は第1引数、$# は引数の個数、shift は引数を左にシフトします。)

そして、第1引数に画像フォーマット名を指定して実行すると、 後の引数で指定したファイルが、その画像フォーマットに変換されます。
(下記では、BMP に変換しています。)

  % convert2img bmp foo.png bar.jpg

以上、先週にひきつづき、bash の設定方法をご紹介しました。

先週書き忘れたのですが、.bashrc にうっかりな記述をすると、 ログインできない体になってしまうことがあります。
(たとえば、.bashrc に logout と書けば、そうなります。極端ですが。)

自分が root になる権限を持っているなら、 root になって書き換えればよいのですが、そうでない場合は、 システム管理者のかたに迷惑をかけてしまうことになります。

ですので、.bashrc の設定変更を試すときには、 必ずログインした状態を保っておいて、別のところからログインして確認してください。

宿題の答え

先週の宿題は、

  エイリアスを重複して設定したときの振舞いを、確認してみましょう。

でした。

たとえば、同じ名前の別名を複数設定すると、どうなるでしょうか。
まず、ls の別名を ls -1i に設定してみます。

  % alias ls="ls -1i"
  % ls
  8848353 #119.txt#
  8127220 001.txt
  8127221 002.txt
  ...後略...

そして、今度は、中身を ls -l に設定してみましょう。

  % aliase ls="ls -l"
  % ls
  -rw-r--r-- 1 usu adm  2093 Sep 19 22:16 #119.txt#
  -rw-r--r-- 1 usu adm  6302 Feb 28  2005 001.txt
  -rw-r--r-- 1 usu adm  6614 Mar  6  2005 002.txt
  ...後略...

もし、両方が合わさって ls -1i -l となるのであれば、

  % \ls -1i -l
  8848353 -rw-r--r-- 1 usu adm  2473 Sep 19 22:19 #119.txt#
  8127220 -rw-r--r-- 1 usu adm  6302 Feb 28  2005 001.txt
  8127221 -rw-r--r-- 1 usu adm  6614 Mar  6  2005 002.txt

となるはずですが、なりませんので、完全に上書きされるようです。
ちなみに、自分自身を中身に使おうとすると、実行時に叱られます。

  % alias foo="echo YES"
  % foo
  YES
  % alias foo="foo or NO"
  % foo
  bash: foo: command not found

では、同名ではなく、他の別名を使用すると、どうなるでしょうか。

  % alias foo="echo YES"
  % alias bar="foo or NO"
  % foo
  YES
  % bar
  YES or NO

ちゃんと展開されました。
ちなみに、foo と bar の設定の順番を入れ換えても、問題ありません。

  % unalias foo bar
  % alias bar="foo or NO"
  % alias foo="echo YES"
  % foo
  YES
  % bar
  YES or NO

実行時に解釈しているからでしょうか。
というわけで、できるだけ、 重複しない別名をつけたほうがよさそうだということがわかりました。 (すごい結論だ…)

今週の宿題

今週の宿題は、

  宛先、題名および内容を引数で指定して、メールを送信する関数を作成
  してください。

です。

またメールかよって感じですが、 Mail コマンドを呼び出す関数を作れば実現できそうですよね。
特定の引数を指定する方法は、きちんとご紹介していませんので、 各自で調べていただけますと幸いです。

あとがき

すべてのものには、終わりがあります。

ここのところ、DVDレコーダや FAX など、 いろんな家電の調子がおかしくなってきていました。

DVDレコーダや FAX は、壊れてから買いに走っていると、 その間使えなくなりますので、今日、プリンタも含めて、思い切って購入しました。

さきほど、購入したモノすべての設置と設定を行ったのですが、 ここ近年のプリンタの多機能さよりも驚いたのは、 DVDレコーダの初期設定の面倒くささ、でした。

FAX やプリンタのほうが歴史が長いですし、 お互いに機能を理解しているというのもありますが、それを差し引いても、 DVDレコーダの初期設定は直感的にわかりにくすぎるように思われます。

なんて思ったところで、ふと気づいたのは、やはり「わがふり」です。
提出の義務のためだけに、仕様書や報告書を書いていますので、 えらそーなことはぜんぜん言えません。

このメルマガでも、よく、 読者のかた(のレベルなど)を想定せずに書いてしまっていることがあります。
こういう記述でわかるかなとか、こういうことを知りたいかなとか、これからは、 読むひとのことを考えて、書こうと思います。

しかし、DVDレコーダがほんとうの家電に昇格するには、 まだまだ課題がありそうに思います。それは、使う側の慣れの問題かもしれませんが。

 

さて、来週も、懲りずに bash の続きをご紹介します。
(それを見越した題名をつけてしまいましたので…。)
来週で必ず終わりにしますので、もうしばらく辛抱していただけますと、 ありがたやです。

 

今週も、ここまで読んでいただき、ありがとうございました。
それでは、また来週(…が、がんばります)に、お会いしましょう!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」−栗に関する、いろいろ情報やモノをいただいております。
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本