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

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


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

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

わたくしの属する会社では、毎月、 Software Design とインターフェースが本社から送られてきます。 無料で読めるものは、存分に有効活用すべきだと思っていますので、2冊とも、 なるべく目を通すようにしています。

さて、いつものように Software Design が届きましたので、 ぱらぱらとめくっていましたら、巻末特別企画が、

  さらに使いこなすための bash 逆引き実践TIPS集

と書かれていました。

…うわー、また微妙にかぶってしまいましたね。でも、 どちらかというと操作方法がメインで、 内容はそれほどかぶっていないみたいでした。
ちょっと、ほっとしました。(小心者です)

というわけで、操作方法などは Software Design を、 カスタマイズなどは当メルマガを参照すれば、 bash をそれなりに使いこなせそうですね。

…と、強引に結論づけたところで、今週も、はりきってまいりますよ。

今週のお題 - bash を自分好みに設定する / 最後の聖戦

先々週、先週と、bash の設定方法らしきことを、ご紹介しました。

Vol.118 - bash を自分好みに設定する
http://www.usupi.org/sysad/118.html
Vol.119 - bash を自分好みに設定する / 魔宮の伝説
http://www.usupi.org/sysad/119.html

今週は、残り…とはいえまだまだご紹介しきれていないのですが…といいますか、 知ってると便利だと思われる、ヒストリとディレクトリスタックについて、 ご紹介したいと思っております。


ヒストリは、自分が実行したコマンドの履歴を参照して、実行できる機能です。 Windows の cmd.exe にも、似たような機能があったと思います。

今まで使用したコマンドの履歴は、bash 終了時に、 ~/.bash_history というファイルへ記録されます。そして、 次に bash を起動したとき、読み込んで使えるようにしてくれます。 時代を超えて使えます。

保存する履歴数は、環境変数 HISTSIZE と HISTFILESIZE で決まります。
HISTSIZE で、現在使用中の bash の履歴数を指定し、HISTFILESIZE で、 ~/.bash_history に記録する履歴数を指定できます。
どちらも、デフォルトは 500 ですので(バージョンなどによって違うかもしれません)、 変更したい貴兄は、~/.bashrc などに記述しましょう。

  export HISTSIZE=2000
  export HISTFILESIZE=2000

 

ただ、なんでもかんでも履歴に残されると、 ちょっとうっとおしいことがあるのではないかと思います。
たとえば、連続して同じコマンドを実行したときに、 履歴に残るのは1つだけで十分という貴兄は、 環境変数 HISTCONTROL に ignoredups を指定しましょう。 重複して記録されなくなります。

  export HISTCONTROL=ignoredups

また、HISTCONTROL に ignorespace を指定しますと、 最初がスペースで始まるコマンドの場合に、履歴に残らなくなります。 履歴に残したくないとき、先頭にスペースを入れる癖をつけると、便利だと思います。

ignoredups も ignorespace も両方必要なんだ! という欲張りな貴兄は、 ignoreboth を指定してください。どちらも有効になります。

 

また、このコマンドは、有無を言わさず履歴に残したくない、 ということもあると思います。 そんなときは、環境変数 HISTIGNORE を使用します。
HISTIGNORE にパターンを指定し、実行したコマンドがそれにマッチすると、 履歴に残らなくなります。
たとえば、引数なしの ls コマンドを履歴に残したくない場合は、 以下のように指定してください。

  export HISTIGNORE=ls

複数指定したい場合は : で区切ります。 また、* や ? といったワイルドカードも使えます。たとえば、 3文字までのコマンドと exit コマンドを履歴に残さない設定は、 以下のようになります。

  export HISTIGNORE=?:??:???:exit

 

ちなみに、履歴を保存するファイルは、デフォルトでは ~/.bash_history ですが、 環境変数 HISTFILE に指定することで、変更できます。
たとえば、OS の異なるマシン間で、ホームディレクトリを共有している場合に、 履歴を $OSTYPE ごとに分けようとするなら、

  export HISTFILE=~/.bash_history-$OSTYPE

などとすれば、よいのではないかと思います。
ちなみに、上記を ~/.bashrc に記述しておくとそうなりますので、 履歴ファイルは、設定ファイルを解釈したあとに読み込んでいるようです。


お次は、ディレクトリスタックです。

複数のディレクトリにわたって一連の作業をしているとき、 いちいち cd コマンドで移動していると、大変ですよね。
そんなとき、ディレクトリスタックを使うと、それらのディレクトリを、 瞬時に渡り歩くことができます。

ディレクトリスタックとは、ディレクトリを格納できるスタックです。
ディレクトリをスタックに積んで、それらを入れ換えることで、 カレントディレクトリを素早く入れ換えられるというものです。
スタックの一番上のディレクトリが、カレントディレクトリです。

スタックに積むためのコマンドが pushd で、 取り出す…つまりカレントディレクトリをごみ箱(?)へ捨てて、 次をカレントディレクトリにするのが popd です。
また、現在の状態は、dirs コマンドで確認できます。

 

百聞は一見にしかずですので、とりあえず試してみましょう。
以下では、/var/tmp へ一時的に移動し、もとの場所へ戻っています。

  % dirs
  ~
  % pushd /var/tmp
  /var/tmp ~
  (/var/tmp でなにか作業)
  % dirs
  /var/tmp ~
  % popd
  ~

pushd /var/tmp を実行しますと、 カレントディレクトリが /var/tmp に変更されますが、 前のディレクトリ(上記では ~)が、その下に格納されています。 なにか作業後、popd を実行しますと、/var/tmp がごみ箱(?)に放り込まれ、 前のディレクトリ(~)がカレントディレクトリになります。

また、/etc/httpd/conf, /home/httpd/html と ~/public_html を頻繁に移動したいときは、 以下のようにしてください。
まず、これらのディレクトリを、ディレクトリスタックに積みます。

  % cd /etc/httpd/conf
  % pushd /home/httpd/html
  /home/httpd/html /etc/httpd/conf
  % pushd ~/public_html
  ~/public_html /home/httpd/html /etc/httpd/conf

そして、pushd コマンドに +1 を指定すると、 カレントディレクトリが次のディレクトリになり、 ディレクトリスタックがぐるっとシフトします。

  % pushd +1
  /home/httpd/html /etc/httpd/conf ~/public_html

2つ目の ~/public_html に移動したいときは、+2 を指定しましょう。

  % pushd +2
  ~/public_html /home/httpd/html /etc/httpd/conf

お察しのとおり、N 番目に移動したい場合は、+N を指定します。
これで、複数のディレクトリを渡り歩くことができますね。

ちなみに、Windows の cmd.exe にも、pushd と popd コマンドがあったと思いますが、 入れるか出すかだけで、シフトはしなかったと思います。
また、dirs コマンドもなかったと思います。いろいろと残念です。

 

ではせっかくですので、環境変数 PROMPT_COMMAND を使って、 ウィンドウのタイトルに表示させてみましょう。

  export PROMPT_COMMAND='echo -ne "\033]0;`dirs`\007"'

前回と同様、エスケープシーケンスを使って、ウィンドウに表示します。
これで、pushd や popd の際に、 標準出力に状態を表示してもらう必要はなくなると思います。ですので、 表示されないようにしてみましょう。

  function pushd_silent() {
      pushd $* > /dev/null
  }
  function popd_silent() {
      popd $* > /dev/null
  }
  alias pushd=pushd_silent
  alias popd=popd_silent

直接 pushd や popd という名前の関数を作りますと、 無限に解釈されてしまうようですので、別の名前の関数を作成して、 エイリアスでそれらを呼ぶようにしています。
(勇気のある貴兄は、function pushd() { pushd $* > /dev/null; } などとしてから、 pushd コマンドを実行してみてください。)

ちなみに、エスケープシーケンスは、他にもいろいろあります。 詳しくはオンラインマニュアルの console_codes をご覧ください。


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

今回ご紹介するにあたって、ひさしぶりに、 自分の ~/.bashrc の設定を見直してみました。
基本的には、昔の設定のままでも変わらず動作していましたが、 今回調査してわかったことを反映することで、さらに使い勝手がよくなりました。

ですので、デフォルトのまま使っている貴兄や、 しばらく設定を変更していないという貴兄、 はたまた知らなかった設定があったなという貴兄は、これを機会に、 是非、~/.bashrc などをいじくってみてくださいまし。

宿題の答え

先週の宿題は、

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

でした。

以下のような、mailsend という名前の関数を作ってみました。

  function mailsend() {
      if [ $# -lt 3 ]; then
          echo "Usage mailsend to_address subject message"
          return 1
      else
          toad=$1
          subj=$2
          shift 2
          echo $* | /usr/bin/Mail -s $subj $toad
          return 0
      fi
  }

第1引数に送信先アドレス、第2引数に題名、残りを本文としました。
引数の残りをすべて本文とするため、shift 2 を用いています。 shirt 2 とすることで、第1と第2引数が消えて、$* が残りすべてとなります。

~/.bashrc かなにかに上記を書いて反映させたら、たとえば、 以下のように実行してみてください。

  % mailsend usu@usupi.org "`echo テストだよ | nkf -M`" \
  "`echo テストですがなにか。 | nkf -j`"

題名は、nkf -M を用いて、MIME の BASE64 に変換しています。
本文は、nkf -j を用いて、JIS コードに変換しています。
上記を実行して、テストだよメールが届けば、成功です。
(usu@usupi.org のところは、自分のアドレスに変更してください。 変更せずに実行しても、わたしは怒りませんが、返事もしませんので…。)

今週の宿題

今週の宿題は、

  ディレクトリスタックの状態を PROMPT_COMMAND で表示する際に、長い
  パスを短く表示してみましょう。

です。

ディレクトリスタックの状態を、PROMPT_COMMAND を使って表示する方法は、 本題でご紹介しました。しかし、ひとつひとつのパスが長い場合に、 タイトルにおさまりきらなくなってしまい、カレントディレクトリすらもわからない! という事態に陥ることもしばしばです。(おおげさですが)

個々のパスを短くしてしまえば、 ある程度はおさまる可能性が出てくるのではないかと思います。 どう短くするかは、貴兄におまかせします。

あとがき

今日は、めずらしく休日出勤をして、近々リリースするソフトの確認を、 えんえんとしていました。

音が鳴ったり動画が再生されたりする端末なのですが、 各種フォーマットに対応しているため、 それらのフォーマットのファイルが再生できるか、 ひとつひとつ確認する必要があるわけですね。

でも、あろうことか、それらのファイルが、すべて同じ曲なんですよ。
ファイルの数は、せいぜい24個なので、まだましなほうだと思いますが、 それでも、1回のチェックで24回同じ曲を聴かなければならないというのは、 ボディブローのように、じわじわと心にダメージが伝わります。

ファンのかたには申し訳ないですが、山下達郎と竹内まりやの曲が、 段々と嫌いになっていきました。(…ああ、言ってしまった…すみません…)

いや、これは、何かの陰謀なのではないか、とすら思えてきます。
チェックするひとが嫌いになってほしい曲にしたり、 サブリミナルな何かを音に忍ばせたりしているのではないかとか…。

…ええっと、少し弱っているようですので、このくらいで、 今週はおわりにさせていただきたいと存じます。

あ、最近書いていませんでしたが、感想や、 こんなのを取り上げてほしいというご要望などは、いつでもウェルカムです。
ここのところ返事が溜っていますが(すみませんー!)、必ずお返事しますので、 めげずにご連絡いただけますと、感謝感激です。

 

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

 

「いますぐ実践! 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

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本