« sshd を活用する | トップページ | FreeBSD の操作を効率的に(tcsh:後編) »

FreeBSD の操作を効率的に(tcsh:前編)

 シェルとは、使用する人(ユーザ)と OS の間の仲立ちをしてくれるプログラムのことです。

 OS は、プログラムから見て使いやすいように作られていますが、逆に人から見た場合には、とっつきにくくできているので(^^;シェルという、OS との橋渡しをしてくれるものが自然と必要になります。

 また、GUI が主流となっている現在では、シェルとは、OS の見た目と使い勝手を決めるもの、という とらえ方 もありますが、これもなかなか、いいところを突いていると思います(^^)


■ シェルを tcsh に設定する

 FreeBSD では、追加したばかりのユーザは、シェルが /bin/sh設定されているので、これを FreeBSD で、もっともおすすめのシェル、tcsh に変更します。
 《 ユーザ violet の、現在のシェルを確認 》
$ grep violet /etc/passwd[Enter]
violet:*:1021:1021:User &:/home/violet:/bin/sh ← /bin/sh
 《 選択できるシェルを表示 》
$ cat /etc/shells[Enter]
# $FreeBSD: src/etc/shells,v 1.5.34.1 2009/04/15 03:14:26 kensmith Exp $
#
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/sh
/bin/csh
/bin/tcsh ← これ
 《 シェルを tcsh に変更 》
$ chsh -s /bin/tcsh[Enter]
Password:《 violet のパスワードを入力 》[Enter]
chsh: user information updated
$  
 これで、一度ログオフして、再度ログインし直せば、tcsh がシェルとして起動します。
 《 ログアウト 》
$ exit[Enter]

 《 再度ログイン 》
login: violet[Enter]
Password:《 violet のパスワードを入力 》[Enter]
>   ← プロンプトが ">" に変わった
 ~~~
 《 シェル変数 "shell" を表示 》
> set | grep shell[Enter]
shell   /bin/tcsh
>  
(※ tcsh の一般ユーザのプロンプトは、本来「>」ですが、これ以降は(いままで通り)「$」で代用します。)

 ちなみに、root のシェルは変更してはいけない、という古くからの言い伝えがありますので、root のシェルは変更しないようにして下さい。

 とはいっても、一般ユーザでログインして、/usr/bin/su で root になった場合には、ユーザのシェルがそのまま引き継がれますし、(やむをえない事情で)root でログインしたときも、
 《 指定したプログラムを現在のシェルの代わりに実行 》
# exec tcsh[Enter]
 とすれば、tcsh を起動することができます。


■ tcsh の機能

 次に、よく使う tcsh の機能を紹介します。

コマンドライン編集

 当たり前だと思っている人も多いですが(^^;、tcsh では、コマンドラインに入力した文字の編集ができます!

[←], [→]カーソルを左右に移動
[BS]カーソルの左の文字を削除
[Ctrl]+[A]コマンドラインの先頭に移動
[Ctrl]+[E]コマンドラインの最後に移動

履歴ヒストリ

 以前に実行したコマンドを記憶しておき、あとから簡単に呼び出せるようにする機能です。

[↑]新しいものから順に、履歴を呼び出す
[↓]履歴を、新しい方へ戻る
[Esc][P]入力された文字で始まる履歴を、
新しいものから順に呼び出す
[Esc][N]入力された文字で始まる履歴を、
新しい方へ戻る
history履歴の一覧を表示
!nn番目の履歴を呼び出して、即実行

 ちょっと、試してみましょう。
 《 履歴の一覧を表示 》
$ history[Enter]
     1  20:00   cat /etc/passwd
     2  20:00   grep violet /etc/passwd
     3  20:00   cat /etc/shells
     4  20:00   chsh -s /bin/tcsh
     5  20:01   history
$  
 ここで、[↑] を押すごとに、「history」→「chsh -s /bin/tcsh」→「cat /etc/shells」→「grep violet /etc/passwd」→「cat /etc/passwd」が順番にコマンドラインに表示され、好きなときに [Enter] を押せば、表示されている履歴がコマンドとして実行されます(実行前に、コマンドラインを編集することもできます)。

 また、[↓] を押せば、「cat /etc/passwd」→「grep violet /etc/passwd」→「cat /etc/shells」→「chsh -s /bin/sh」→「history」→「(空白)」の順に、履歴を新しい方に向かって戻ることができます。

 履歴の中から、特定のものだけを探したい場合、
$ ca 
 と入力してから、[Esc][P] を押せば、「cat /etc/shells」→「cat /etc/passwd」と、「ca」で始まる履歴だけが表示されます。

 また、history コマンドで表示される番号を使って、コマンドを実行することもできます。
 《 2番の履歴を呼び出して再実行 》
$ !2[Enter]
grep violet /etc/passwd
violet:*:1021:1021:User &:/home/violet:/bin/tcsh
$  
補完

 ちょっと前は、「ファイル名のホカン」などど言ってもポカーンとされるだけでしたが、最近は「補完」という漢字を思い浮かべてくれる人が増えて、説明が楽になりました(^^;

 UNIX はディレクトリが深いので、この補完は、必須の機能です(^^)

[Tab]ディレクトリ名/ファイル名を補完
[Ctrl]+[D]ディレクトリ名/ファイル名の候補を表示

 補完の例: 下線部が、補完された文字を示します。
[Tab] による補完では、実際には行は変わらず、コマンドラインがどんどん右に伸びていきます。)
$ less /u[Tab] 《 補完実行 》
 
$ less /usr/  《 ディレクトリ名が補完された 》
 
$ less /usr/p[Tab]
 
$ less /usr/ports/ 
 
$ less /usr/ports/d[Tab] 
 
$ less /usr/ports/d  《 補完されない!? 》
 
$ less /usr/ports/d[Ctrl][D] 《 候補を表示 》
databases/ deskutils/ devel/     distfiles/ dns/
$ less /usr/ports/dn[Tab] 《 "n" を追加し、補完実行 》
 
$ less /usr/ports/dns/ 
 
$ less /usr/ports/dns/u[Tab]
 
$ less /usr/ports/dns/u  《 補完されない!? 》
 
$ less /usr/ports/dns/u[Ctrl][D] 《 候補を表示 》
udns/     unbound/  updatedd/
$ less /usr/ports/dns/un[Tab] 《 "n" を追加し、補完実行 》
 
$ less /usr/ports/dns/unbound/ 
 
$ less /usr/ports/dns/unbound/M[Tab]
 
$ less /usr/ports/dns/unbound/Makefile   《 ファイル名が補完された 》
 …これだけをみると、分かりづらい気がしますが、実際にやってみると、案外簡単です(^-^)

 補完では、ディレクトリ名が補完された場合には、最後に「/」が付き、ファイル名が補完された場合には、最後に「(空白)」が追加されます。

 ただし、最初の文字が一致するディレクトリ/ファイルが2個以上あるときは、途中までしか補完してくれないので、そのときは [Ctrl]+[D] で候補の一覧を表示し、ほかと区別が付くところまで文字を追加入力したあとで、再度 [Tab] を押して補完を実行ます。

 なお、何も文字が入力されていない状態で [Ctrl]+[D] を押すと、シェルが終了しログアウトしてしまうので、注意してください(^^;;

ワイルドカード展開

 複数のファイルをまとめて指定できる機能です。

  ?  任意の1文字にマッチ
  *  0文字以上の任意の文字にマッチ

 …言ってることが分かりませんね(^^;。 例を示します。
 《 /bin ディレクトリ内にあるファイルを表示 》
$ ls /bin[Enter]
[               df              link            pwd             sleep
cat             domainname      ln              rcp             stty
chflags         echo            ls              realpath        sync
chio            ed              mkdir           red             tcsh
chmod           expr            mv              rm              test
cp              getfacl         pax             rmail           unlink
csh             hostname        pgrep           rmdir           uuidgen
date            kenv            pkill           setfacl
dd              kill            ps              sh
 《 ワイルドカードの例1:末尾の「*」 》
$ ls /bin/ch*[Enter]
/bin/chflags    /bin/chio       /bin/chmod
 《 ワイルドカードの例2:先頭の「*」 》
$ ls /bin/*sh[Enter]
/bin/csh        /bin/sh         /bin/tcsh
 《 ワイルドカードの例3:途中の「*」 》
$ ls /bin/t*h[Enter]
/bin/tcsh
 《 ワイルドカードの例4:「?」 》
$ ls /bin/t?s?[Enter]
/bin/tcsh       /bin/test
$  
 また、tcsh の「*」は強力で、次のようなこともできます。
 《 複数ディレクトリで、ファイル内を検索 》
$ grep kqueue /usr/include/*/*/*[Enter]
/usr/include/cam/scsi/scsi_targetio.h: * of CCB completion through poll/select/kqueue and then calls
/usr/include/dev/firewire/firewirereg.h:#include &gh;sys/taskqueue.h<
/usr/include/dev/firewire/firewirereg.h:        struct taskqueue *taskqueue;
/usr/include/dev/firewire/fwohcivar.h:#include &gh;sys/taskqueue.h<
/usr/include/dev/usb/if_auereg.h:       struct usb_taskqueue    aue_taskqueue;
/usr/include/dev/usb/usb_ethersubr.h:struct usb_taskqueue {
 ~~~
$  
● ディレクトリの移動

 ディレクトリ間の移動は、UNIX の基本中の基本です。

cd dir指定されたディレクトリに移動。
dir を指定しないとホームディレクトリに移動
pushd dir カレントディレクトリを保存して、
指定されたディレクトリに移動
popd保存したディレクトリに戻る
dirspushd で保存されたディレクトリ一覧を表示
pwdカレントディレクトリのパスを表示

 また、ディレクトリの特殊な表現法として、

  /  ルートディレクトリ
  .  カレントディレクトリ
  ..  親ディレクトリ
  ~  ユーザのホームディレクトリ

 があります。

パイプリダイレクト

 パイプ、リダイレクトの説明の前に、標準入出力について説明しておきます。

 一般に、プログラムには、起動と同時に、標準入力stdin)、標準出力stdout)、標準エラーstderr)という、3つの入出力先が割り当てられます

 通常は、標準入力がキーボード、標準出力標準エラーが表示画面に結びつけられますが、これを別なものに切り替えるのがパイプリダイレクトです。

 ○ 基本的なパイプ、リダイレクト
  上の3つ(不等号のしるし)がリダイレクト、一番下(縦棒)がパイプです。

cmd < file標準入力をファイルへ切り替え
file から入力を読み込む)
cmd > file標準出力を file に出力
(既存ファイルがあれば上書き)
cmd >> file標準出力を file に出力
(既存ファイルがあれば、後半に追加)
cmd1 | cmd2 cmd1 の標準出力を cmd2 の標準入力とする

 ○ ちょっと難しいパイプ、リダイレクト
  使用するシェルによって、書き方が微妙に違います。以下は、tcsh の例。

cmd >& file標準出力と標準エラーを file に出力
(既存ファイルがあれば上書き)
cmd >>& file標準出力と標準エラーを file に出力
(既存ファイルがあれば、後半に追加)
(cmd > file1) >& file2 標準出力を file1 に、
標準エラーを file2 に出力(^^;
cmd1 |& cmd2cmd1 の標準出力と標準エラーを
cmd2 の標準入力とする

 なお、両側をパイプで結んで使うコマンドを、フィルタと呼ぶことがあります。

 ○ 有名なフィルタコマンド(の改悪版…(^^;;
 《 ファイル中の単語の出現頻度を調べる 》
$ cat /etc/motd | tr 'A-Z' 'a-z' | tr -cs 'a-z' '\012' | sort | uniq -c | sort -nr[Enter]
   9 the
   7 freebsd
   6 to
   5 and
   4 you
   4 with
   4 org
   4 if
   4 are
   3 www
   3 please
~~~~~~~~~~~~
$  

ジョブプロセスの管理

 FreeBSD は、複数のプログラム(正確にはプロセス)を同時に実行できる、マルチタスクの OS なので、コマンドラインからも複数のプロセスを扱えるようになっています

 ジョブプロセスは、どちらも似たような言葉ですが、一応、使い分けがされています。

プロセス:メモリ上に読み込まれた、プログラムの実行単位1個1個のこと
ジョブ:連携して動いているプロセスをひとまとまりにしたもの。
 上で紹介した「ファイル中の単語の出現頻度を調べる」コマンドは、全体で1つのジョブとなります

psプロセスの一覧を表示
jobsジョブの一覧を表示
killプロセス/ジョブにシグナルを送る
killall同上
fg %jobjobフォアグランドに回して実行
bg %jobjobバックグラウンドに回して実行
cmd &プログラムをバックグラウンドで実行
[Ctrl]+[Z]フォアグラウンドのジョブを停止
stop %job バックグラウンドで実行中の job を停止

 ジョブ管理の例1(終わるまで長い時間がかかるプログラムを「裏」に回して、その間にほかの仕事を片付ける)
 《 時間のかかるコマンドを実行 》
$ sleep 60[Enter]
[Ctrl][Z] 《 コマンドの実行を一時中断 》
^Z
Suspended
$   ←《 次のコマンドが受け付け可能になる 》
 ~~~
 《 ジョブの一覧を表示 》
$ jobs[Enter]
[1]  + Suspended                     sleep 60
 《 バックグラウンドで実行を再開 》
$ bg %1[Enter]
[1]    sleep 60 &
$  
 ~~~
 《 ほかの仕事とを進める 》
 ~~~
 《 終わった頃に[Enter]を押すと… 》
$ [Enter]
[1]    Done
$  
 もっとも、最初から「sleep 60 &」と、時間のかかるプログラムをバックグラウンドで起動させておけば、[Ctrl]+[Z] や「bg %1」の手間は掛からなかったワケですが、実行してから初めて気付くことも、よくあるので…(^^;;

 ジョブ管理の例2(root と 一般ユーザを行き来する)
 《 root になる 》
$ /usr/bin/su[Enter]
Password:《 root のパスワードを入力 》[Enter]
 《 root の仕事をする 》
# tail /var/log/security[Enter]
 ~~~
 《 root のシェルを停止させる 》
# suspend[Enter]

Suspended (signal)
 《 一般ユーザで作業 》
$ tail /var/log/messages[Enter]
 ~~~
 《 ジョブの一覧を表示 》
$ jobs[Enter]
[1]  + Suspended (signal)            /usr/bin/su
 《 再び root に戻る 》
$ fg[Enter]
/usr/bin/su
#  

● 続きは…

 …次回に続きます(多分(^^;

|

« sshd を活用する | トップページ | FreeBSD の操作を効率的に(tcsh:後編) »

コメント

Cefadroxil 500 Mg Dosage, cefadroxil 250 usa cefadroxil, cefadroxil capsules 500mg order cefadroxil, discount cefadroxil cefadroxil capsules, cefadroxil 500 mg dosage cefadroxila 500Mg; Soup.io,.

投稿: united states cefadroxil | 2013/12/06 12:02

Cheap Apcalis Sx, uk apcalis sx apcalis sx 20, uk apcalis sx get apcalis sx, buy apcalis sx order apcalis sx, get apcalis sx order apcalis sx, purchase apcalis sx cheap apcalis sx (lockgambflexde1970.miiduu.com).

投稿: apcalis sx oral jelly | 2013/12/19 08:54

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: FreeBSD の操作を効率的に(tcsh:前編):

« sshd を活用する | トップページ | FreeBSD の操作を効率的に(tcsh:後編) »