シェル変数、環境変数、シェル・スクリプト

					2018年06月08日
情報科学類 コンピュータリテラシ

                                       筑波大学 システム情報系
                                       新城 靖
                                       <yas@cs.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~yas/coins/literacy-2018/2018-06-08
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~yas/
http://www.cs.tsukuba.ac.jp/~yas/

■連絡事項

■復習

■シェル変数と環境変数

■変数とは

変数(variable)
何かを覚えるためのもの。メモリを抽象化して名前をつけたもの。
変数名(variable name)
変数を区別するための名前
変数の値(value)
変数が覚えているもの
変数の値を参照(reference)
変数の値を取り出すこと
変数に値を代入(assignment)
変数名で変数を指定して、その値を変更する。変数に値をセットする。

◆シェル変数と環境変数の違い

シェルでは、2種類の変数を使える。
シェル変数
1つのシェル内でのみ有効。
環境変数
実行されるプログラム(子プロセス)に引き継がれる。

◆echo コマンドの復習

echo コマンドは、引数をそのまま画面(標準出力)に出力するコマンド。
$ echo hello [←]
hello
$ echo hi [←]
hi
$ echo /usr/bin/*z [←]
/usr/bin/DeRez /usr/bin/Rez
$ echo /usr/bin/DeRez /usr/bin/Rez [←]
/usr/bin/DeRez /usr/bin/Rez
$ []

◆シェル変数の操作

シェル変数へ代入するには、「変数名=」を使う。
$ X=100 [←]
$ []
参照するには、「$変数名」とする。
$ X=100 [←]
$ echo $X [←]
100
$ []
他の変数と紛らわしい時には、 「"$変数名"」のようにダブルクォートで括るとよい。
$ echo x"$X"x [←]
x100x
$ []
(注意: $Xx と $X は別の変数なので区別できるようにする。) あるいは、${変数名}のように、 括弧で括る方法もある。
$ echo x${X}x [←]
x100x
$ []

シェル変数を削除するには、unset コマンドを使う。

$ unset X [←]
$ echo $X [←]

$ echo x"$X"x [←]
xx
$ []
設定されていないシェル変数を使おうとすると、空として扱われる。 注意:シェルのプロンプト($ ) と間違えないこと。シェルのプロンプ ト($ ) は、実際のコンピュータでは、 crocus38:~ s1812345$ のようになっている。

◆シェル変数を何に使うか

重複した入力を避けて、楽をするために使う。
$ coins=coins.tsukuba.ac.jp [←]
$ ssh www.$coins [←]
$ ssh crocus10.$coins [←]

◆環境変数の代入

bash では、シェル変数の変数名を export コマンドに与えることで、 そのシェル変数を環境変数に変える。
$ X=100 [←]
...
$ export X [←]
$ []
あるいは、最初から export を付けて代入の操作をすることもできる。
$ export X=100 [←]
$ []
bash では、環境変数の参照方法と削除方法はシェル変数と同じ($とunset)である。

◆環境変数の利用方法(TZ)

シェルがプログラムを実行する時、シェル変数は、プログラムへ引き渡されな いが、環境変数は、渡される。環境変数は、プログラムの動作を変更するため に用いる。 以下の例では、環境変数 TZ を設定して、date コマンドの動きを 変えている。
$ date [←]
2018年 6月 7日 木曜日 09時41分40秒 JST
$ echo $TZ [←]

$ TZ=EST [←]
$ echo $TZ [←]
EST
$ export TZ [←]
$ date [←]
2018年 6月 6日 水曜日 19時41分57秒 EST
$ []
マニュアルの ENVIRONMENT に記述されている。
$ man date [←]

DATE(1)                   BSD General Commands Manual                  DATE(1)

NAME
     date -- display or set date and time

SYNOPSIS
     date [-ju] [-r seconds] [-v [+|-]val[ymwdHMS]] ... [+output_fmt]
     date [-jnu] [[[mm]dd]HH]MM[[cc]yy][.ss]
     date [-jnu] -f input_fmt new_date [+output_fmt]
     date [-d dst] [-t minutes_west]

DESCRIPTION
     When invoked without arguments, the date utility displays the current
     date and time.  Otherwise, depending on the options specified, date will
     set the date and time or print it in a user-defined way.
...
ENVIRONMENT
     The following environment variables affect the execution of date:

     TZ      The timezone to use when displaying dates.  The normal format is
             a pathname relative to /usr/share/zoneinfo.  For example, the
             command ``TZ=America/Los_Angeles date'' displays the current time
             in California.  See environ(7) for more information.
...

◆空白を含むシェル変数

シェル変数や環境変数で、空白を含んでいる(可能性がある)時には、ダブル クォート "" で括ると1単語として扱われる。
$ as="Application Support" [←]
$ echo $as [←]
Application Support
$ ls -ld ~/Library/$as [←]
ls: /home/prof/yas/Library/Application: No such file or directory
ls: Support: No such file or directory
$ ls -ld ~/Library/"$as" [←]
drwx------  14 yas  prof  4096  4 26 12:27 /home/prof/yas/Library/Application Support
$ []

◆シェルのメタキャラクタ

シェルが解釈し、コマンドには渡されない文字。 < > | $ { } ( ) [ ] & ; ^ " * ? ~ ' ` 空白 タブ など。

コマンドの引数として渡したい時には、解釈を避ける(エスケープ(escape))た めの特殊な形式を使う。
形式 エスケープ対象 エスケープしないメタキャラクタ
\x \」の直後の一文字 なし (行末の「\」は継続行の意味)
'str' 「'」でくくられた文字列 「'」自身は入れられない。「\'」も効かない。
"str" 「"」でくくられた文字列 「$」, 「`」(バッククォート),「"」(ダブルクォート), 「\」,「!」
\は、ASCII 5c(16進)の文字。表示は、「\」か「¥」。

ダブルクォート "" の内部では、$ は解釈され、シェル変数や 環境変数の置き換えられる。シングルクォート 「''」では、$ は解釈さない。

$ echo $HOME [←]
/home/prof/yas
$ echo "$HOME" [←]
/home/prof/yas
$ echo '$HOME' [←]
$HOME
$ echo \$HOME [←]
$HOME
$ []

◆空白のエスケープ

ファイル名の一部に空白を含む場合、エスケープする必要がある。
$ ls -ld "/Applications/QuickTime Player.app" [←]
drwxr-xr-x+ 3 root  wheel  102  5 15 22:29 /Applications/QuickTime Player.app
$ open "/Applications/QuickTime Player.app" [←]
$ []
バックスラッシュを使ってもよい。
$ ls -ld /Applications/QuickTime\ Player.app [←]
drwxr-xr-x+ 3 root  wheel  102  5 15 22:29 /Applications/QuickTime Player.app
$ open /Applications/QuickTime\ Player.app [←]
$ []
bashのファイル名補完機能 では、空白を含むファイル名は、バックスラッシュで自動的に補完されることがある。
$ ls -ld /A[]
$ ls -ld /A[tab][]
$ ls -ld /Applications/[]
$ ls -ld /Applications/Q[]
$ ls -ld /Applications/Q[tab][]
$ ls -ld /Applications/QuickTime\ Player.app/[]
ファイル名の補完機能を使う時には、空白を打ち込むには、 「\ バックスラッシュ スペース」と打つ必要がある。

補完よりも、ファイル名の置き換え機能が簡単のこともある。
$ ls -ld /A*/Q* [←]
drwxr-xr-x+ 3 root  wheel  102  5 15 22:29 /Applications/QuickTime Player.app
$ []

◆環境変数PATH

環境変数PATHは、コマンドが存在するディレクトリを保持している環境変数である。
$ echo $PATH [←]
/home/prof/yas/bin:/usr/local3/coins/macosx/bin:/usr/local3/coins/common/bin:/us
r/local3/bin:/usr/X11/bin:/Developer/Simulator/GTKwave/bin:/usr/bin:/bin:/usr/sb
in:/sbin:/usr/local/bin:/opt/X11/bin:/usr/local/MacGPG2/bin:/opt/local/sbin:/opt
/local/bin:/usr/texbin
$ printenv PATH [←]
/home/prof/yas/bin:/usr/local3/coins/macosx/bin:/usr/local3/coins/common/bin:/us
r/local3/bin:/usr/X11/bin:/Developer/Simulator/GTKwave/bin:/usr/bin:/bin:/usr/sb
in:/sbin:/usr/local/bin:/opt/X11/bin:/usr/local/MacGPG2/bin:/opt/local/sbin:/opt
/local/bin:/usr/texbin
$ []
シェルは、打ち込まれたコマンドを環境変数 PATH の中から探して実行する。 たとえば、ls と打ち込まれると、/bin にある /bin/ls を実行する。

複数のコマンドがみつかれば、PATHの先に見つかったものを実行する。 どのコマンドが実行されるかを確認するには、which コマンドを使う。

$ which ls [←]
/bin/ls
$ []

■コマンド行の編集機能とヒストリ機能

◆historyコマンド

history コマンドは、過去に打ち込んだコマンドの一覧を表示するコマンドである。
$ history [←]
    1  saykotoeri2 
    2  saykotoeri2 
    3  fg
    4  dup
<中略>
  500  history
$ []
シェル変数 HISTFILESIZE の個数だけ記憶している。
$ echo $HISTFILESIZE [←]
500
$ []

◆bashのコマンド行の編集機能

bash には、Emacs に似せて、コマンド行の編集機能がある。

◆「!」と「^」

bash には、過去に打ち込んだコマンドを記憶して再現する機能がある。 bash では、コマンド行の編集機能があるので使わなくてもよいが、次の ことは理解しておく必要がある。

◆利用

bash では、 コマンド行の編集機能 で、ヒストリをさかのぼって編集して利用できる。 その他に、次のような方法もある。bash では、ほとんど使われない。 編集機能がないシェルでは有効であった。
!!
直前のコマンドの再実行
!10
history で表示される 10番のコマンドの実行
!-2
現在からさかのぼって2個前のコマンドの実行。!-1 は、!! と同じ。
!str
先頭が str から始まるコマンドで、最も最新のもの。
!?str
文字列 str を含むコマンドで、最も最新のもの。
^old^new
直前のコマンドの old を new で置き換えたもの。打ち間違いの修正。
!*
直前のコマンドの引数(コマンド名以外)
利用例:
$ ls file.txt [←]
file.txt
         ここで -l を付けわすれたのに気がつく
$ ls -l !* [←]
ls -l file.txt
-rw-r--r--  1 yas  prof  9  4 29 21:23 file.txt
$ []

■シェル・スクリプト

(よく利用する)シェルに対するコマンドを、ファイルに保存して、(簡単に) 実行できるようにしたもの。簡単なプログラミングとも言える。

◆bash

Coins での標準のログインシェルは、bash。端末(iTerm, xterm, ktermなど)を 開いたり、ssh で遠隔ログインすると、ログインシェルが実行される。

bash (Bourne-Again SHell) は、sh (Bourne Shell)の機能を強化したもの。 シェル・スクリプトを書く時には、多くのシステムで備わっている /bin/sh を 使うことも多い。(/bin/sh はあるが /bin/bash がないシステムもある。)

◆シェル・スクリプトの作り方(1):基本

まず端末から実行してみる。

例:サイズが大きいファイルの上位 10 個を表示したい。 ls コマンドと sortコマンドheadコマンドを組み合わせる。

$ ls -l | sort -k 5 -nr | head [←]
-rw-r--r--   1 yas  prof   28202  6  9 10:24 exam-result.xlsx
-rw-r--r--   1 yas  prof   10465  5 26 11:02 files
-rw-r--r--   1 yas  prof    8574  5 15 18:24 kana.aiff
drwx------  75 yas  prof    8192  5 20  2014 _OLD_HOME_
drwxr-xr-x   4 yas  prof    6144  4 10 11:16 dot
drwx------   4 yas  prof    5120  4 21 14:35 Desktop
-rw-r--r--   1 yas  prof    4320  4 25 18:08 literacy-a4.txt~
-rw-r--r--   1 yas  prof    4307  5  2 17:07 literacy-a4.txt
drwxr-xr-x  71 yas  prof    4096  4 10 17:10 coins
drwxr-xr-x   7 yas  prof    4096  5 19  2016 public_html
$ []
echo コマンド、 historyコマンド あるいは、コピー&ペースト機能を用いて 端末から打ち込んだものを結果をファイルに保存する。以下の例では、echo コ マンドを使ってファイルを作成している。
$ []
(^p で1行もどす。)
$ ls -l | sort -k 5 -nr | head [←]
(^a で、行頭に移動して 「echo '」と打ち、^e して
「' > ls-size」 と打つ)
$ echo 'ls -l | sort -k 5 -nr | head' > ls-size10 [←]
$ cat ls-size10 [←]
ls -l | sort -k 5 -nr | head
$ ls -l ls-size10 [←]
-rw-r--r--  1 yas  prof  29  6 15 14:38 ls-size10
$ bash ls-size10 [←]
-rw-r--r--   1 yas  prof   28202  6  9 10:24 exam-result.xlsx
-rw-r--r--   1 yas  prof   10465  5 26 11:02 files
-rw-r--r--   1 yas  prof    8574  5 15 18:24 kana.aiff
drwx------  75 yas  prof    8192  5 20  2014 _OLD_HOME_
drwxr-xr-x   4 yas  prof    6144  4 10 11:16 dot
drwx------   4 yas  prof    5120  4 21 14:35 Desktop
-rw-r--r--   1 yas  prof    4320  4 25 18:08 literacy-a4.txt~
-rw-r--r--   1 yas  prof    4307  5  2 17:07 literacy-a4.txt
drwxr-xr-x  71 yas  prof    4096  4 10 17:10 coins
drwxr-xr-x   7 yas  prof    4096  5 19  2016 public_html
$ []

◆シェル・スクリプトの作り方(2):「#!」とchmod +x

新Linux/UNIX入門 24-176 参照

シェル・スクリプトを実行する度にいちいち「bash 」と打つのは煩わ しいことがある。その場合は、次のようにする。

1行目にテキスト・エディタで「#!/bin/bash」を書き加える。

$ emacs ls-size10 [←]
(1行目に「#!/bin/bash [←]」と書き加える。)
$ cat ls-size10 [←]
#!/bin/bash
ls -l | sort -k 5 -nr | head
$ []
chmod +x で実行可能属性を付ける
$ ls -l ls-size10 [←]
-rw-r--r--  1 yas  prof  41  6 15 14:41 ls-size10
$ chmod +x ls-size10 [←]
$ ls -l ls-size10 [←]
-rwxr-xr-x  1 yas  prof  41  6 15 14:41 ls-size10
$ []
ファイル名を指定すると、実行することができる。ファイル名としては、明示 的に相対パス名であることを示すために先頭に「./」を付けるか、ホー ムディレクトリにあるこを示すために「~/」を付ける(ホーム・ディレ クトリにあることを仮定している)。
$ ./ls-size10 [←]
-rw-r--r--   1 yas  prof   28202  6  9 10:24 exam-result.xlsx
-rw-r--r--   1 yas  prof   10465  5 26 11:02 files
-rw-r--r--   1 yas  prof    8574  5 15 18:24 kana.aiff
drwx------  75 yas  prof    8192  5 20  2014 _OLD_HOME_
drwxr-xr-x   4 yas  prof    6144  4 10 11:16 dot
drwx------   4 yas  prof    5120  4 21 14:35 Desktop
-rw-r--r--   1 yas  prof    4320  4 25 18:08 literacy-a4.txt~
-rw-r--r--   1 yas  prof    4307  5  2 17:07 literacy-a4.txt
drwxr-xr-x  71 yas  prof    4096  4 10 17:10 coins
drwxr-xr-x   7 yas  prof    4096  5 19  2016 public_html
$ ~/ls-size10 [←]
-rw-r--r--   1 yas  prof   28202  6  9 10:24 exam-result.xlsx
-rw-r--r--   1 yas  prof   10465  5 26 11:02 files
-rw-r--r--   1 yas  prof    8574  5 15 18:24 kana.aiff
drwx------  75 yas  prof    8192  5 20  2014 _OLD_HOME_
drwxr-xr-x   4 yas  prof    6144  4 10 11:16 dot
drwx------   4 yas  prof    5120  4 21 14:35 Desktop
-rw-r--r--   1 yas  prof    4320  4 25 18:08 literacy-a4.txt~
-rw-r--r--   1 yas  prof    4307  5  2 17:07 literacy-a4.txt
drwxr-xr-x  71 yas  prof    4096  4 10 17:10 coins
drwxr-xr-x   7 yas  prof    4096  5 19  2016 public_html
$ []

◆シェル・スクリプトの作り方(3):~/bin

完成したスクリプトを ~/bin に置くと、他のコマンド(ls, cp, emacs) 等と同じように実行することができる。
$ mkdir ~/bin [←]
(注意: mkdir は、1度だけ実行すればよい。)
$ ls-size10 [←]
-bash: ls-size10: command not found
$ mv ls-size10 ~/bin [←]
$ ls -l ~/bin/ls-size10 [←]
-rwxr-xr-x  1 yas  prof  41  6 15 14:41 /home/prof/yas/bin/ls-size10
$ ls-size10 [←]
-rw-r--r--   1 yas  prof   28202  6  9 10:24 exam-result.xlsx
-rw-r--r--   1 yas  prof   10465  5 26 11:02 files
-rw-r--r--   1 yas  prof    8574  5 15 18:24 kana.aiff
drwx------  75 yas  prof    8192  5 20  2014 _OLD_HOME_
drwxr-xr-x   4 yas  prof    6144  4 10 11:16 dot
drwx------   4 yas  prof    5120  4 21 14:35 Desktop
-rw-r--r--   1 yas  prof    4320  4 25 18:08 literacy-a4.txt~
-rw-r--r--   1 yas  prof    4307  5  2 17:07 literacy-a4.txt
drwxr-xr-x  71 yas  prof    4096  4 10 17:10 coins
drwxr-xr-x   7 yas  prof    4096  5 19  2016 public_html
$ []
ホームディレクトリにある「ls-size10」は、そのままファイル名を打 ち込んでも実行できない。mv コマンドで「~/bin/」に移動した後は、 「ls-size10」で実行可能になる。

◆シェル・スクリプトの作り方(4):引数

シェル・スクリプトを実行する時に、シェル・スクリプトに対して引数を与え ることができる。 新Linux/UNIX入門 24-178 参照The Unix Super Text 40.13.2 参照

ls-size10 では、カレント・ワーキング・ディレクトリ(.)だけ表示できる。他 のディレクトリを表示したい。また、上位 10 個ではなく、5 個、20 個と数を 変えたい。 シェル・スクリプトの名前を 「lss」 とする。

$ cd ~/bin [←]
$ ls -l ls-size10 [←]
-rwxr-xr-x  1 yas  prof  41  6 15 14:41 ls-size10
$ ls -l lss [←]
ls: lss: No such file or directory
$ cp ls-size10 lss [←]
$ ls -l lss [←]
-rwxr-xr-x  1 yas  prof  41  6 15 14:46 lss
$ emacs lss [←]
(修正)
$ cat lss [←]
#!/bin/bash
ls -l $2 | sort -k 5 -nr | head -$1
$ []
(cp の時点で x ビットは立っているので chmod +x は不要。)
ls-size10 で ls には引数はなかったが、lss では「$2」を与えている。「$2」 は、コマンドに与えられた引数のうち、2番目のものを意味している。また、 head には -$1 を与えている。

作成したシェルスクリプト「lss」を実行してみる。

$ cd [←]
$ pwd [←]
/home/prof/yas
$ lss 5 /bin [←]
-r-xr-xr-x  1 root  wheel  1315248  2  6  2014 ksh
-r-xr-xr-x  1 root  wheel  1228416  7 21  2016 sh
-r-xr-xr-x  1 root  wheel  1228336  7 21  2016 bash
-rwxr-xr-x  1 root  wheel   530320  2  6  2014 zsh
-rwxr-xr-x  2 root  wheel   357984  2  6  2014 tcsh
$ lss 3 /usr/bin [←]
-r-xr-xr-x   1 root   wheel  11738080  7 21  2016 emacs
-rwxr-xr-x   1 root   wheel  10121104  7 21  2016 php
-r-xr-xr-x   1 root   wheel   5308832  2  6  2014 parl5.16
$ lss 10 . [←]
-rw-r--r--   1 yas  prof   28202  6  9 10:24 exam-result.xlsx
-rw-r--r--   1 yas  prof   10465  5 26 11:02 files
-rw-r--r--   1 yas  prof    8574  5 15 18:24 kana.aiff
drwx------  75 yas  prof    8192  5 20  2014 _OLD_HOME_
drwxr-xr-x   4 yas  prof    6144  4 10 11:16 dot
drwx------   4 yas  prof    5120  4 21 14:35 Desktop
-rw-r--r--   1 yas  prof    4320  4 25 18:08 literacy-a4.txt~
-rw-r--r--   1 yas  prof    4307  5  2 17:07 literacy-a4.txt
drwxr-xr-x  71 yas  prof    4096  4 10 17:10 coins
drwxr-xr-x   7 yas  prof    4096  5 19  2016 public_html
$ []

◆bashスクリプトの引数を参照するためのシェル変数

引数として a b c が与えられた時の実行例。
$ echo $# [←]
3
$ echo $1 $2 $3 [←]
a b c
$ shift [←]
$ echo $# [←]
2
$ echo $1 $2 $3 [←]
b c
$ []

◆bashのコメント

bash では、「#」を使ってコメントを書くことができる。bash は、 文字「#」移行、行末まで無視する。
$ echo a b # c d [←]
a b
$ # echo a b c [←]
$ []

◆bash のコマンドの置換え

bash では、コマンドの標準出力の結果を、別のコマンドの引数に使うことができる。
$ date +%A [←]
金曜日
$ echo Today is `date +%A` . [←]
Today is 金曜日 .
$ []
この例では、バッククォート(` `)で括った部分 が実行され、その結果を echo コマンドの引数に使っている。バッククォート (` `)の代わりに、「$(コマンド)」という形式も 使える。
$ echo Today is $(date +%A) . [←]
Today is 金曜日 .
$ []
コンピュータでは、クォート「'xxx'」とバッククォー ト「`xxx`」は違う。

バッククォートは、シェルスクリプトでもよくつかう。

$ tex=file1.tex [←]
$ basename file1.tex .tex [←]
file1
$ basename $tex .tex [←]
file1
$ base=`basename $tex .tex` [←]
$ echo $base [←]
file1
$ []
The Unix Super Text 15-115 参照The Unix Super Text 40.22.1 参照

◆~/.bashrc

bash は、iTerm の中で新たに実行されたり(遠隔)ログインの時に新たに実行さ れると、~/.bashrc という名前のファイルにあるプログラムを自動的 に実行する。~/.bashrc では、次のようなことを行う。

◆~/.bashrcの編集は慎重に

~/.bashrc を編集したら、一度、iTerm のウィンドウを問題なく開けるか、確 認すると良い。

~/.bashrc に問題があり、iTerm のウィンドウが開かなくなった時には、次の ような方法で修正する。

coins で標準の ~/.bashrc は次のようになっている。
$ cat /usr/local/lib/standard/bashrc-home [←]
#
# coins standard ~/.bashrc [←]
#
if [ -f /usr/local/lib/standard/bashrc ]; then
        . /usr/local/lib/standard/bashrc
fi

# add your own code below [←]
$ []

◆~/.bashrcの編集結果の反映

~/.bashrc を編集しても、現在実行中の bash には影響を与えない。

編集内容を有効にするには、次の方法がある。

◆~/.bashrcでのシェル変数の設定の例

本日の課題(1) では、シェル変数を使って短い表現を行う。 これを恒久的なものにするには、~/.bashrc に保存する。

以下の例は、ssh でよくアクセスするホストをシェル変数に登録している。

$ cat ~/.bashrc [←]
...
coins=coins.tsukuba.ac.jp
www=www.$coins
icho=icho.u.tsukuba.ac.jp
...
$ []
これを使うと、ssh が簡単になる。
$ ssh $www [←]
$ ssh $icho [←]

◆~/bin

~/.bashrcなどを設定して、~/bin環境変数PATH に含まれ るようにすることを奨める。自分で作成したプログラムやシェル・スクリプトを ~/bin に置くと、ファイル名を指定しなくても (「~/ファイル名」や 「./ファイル」打たなくて)、 ~/bin以下の短いファイル名で実行できるようになる。

coins では、標準で ~/binPATH に含まるように設定されて いるので、各自設定する必要はない。

■bash alias (エイリアス)

■コンパイラとインタプリタ

人間が書いたプログラムを実行する方法には、大きく2種類ある。
コンパイラ(compiler, 翻訳系)を使う
人間が書いたプログラム(ソース・プログラム) を、一度、機械語に変換する。 機械語に変換するプログラムを、「コンパイラ」という。 実行時には、コンパイラは不要。
インタプリタ(interpreter, 通訳系)を使う
人間が書いたプログラムを(機械語に変換することなく)直接実行する。 このプログラムを実行するプログラムを、インタプリタという。 実行時にも、インタプリタが必要。

ソース・プログラム、コンパイラ、プロセス、CPU
図? コンパイラ方式でのプログラムの実行

プログラム、インタプリタのプロセス、CPU
図? インタプリタ方式でのプログラムの実行

シェルは、インタプリタ方式で動作する言語処理系とも言える。

コンパイラ方式とインタプリタ方式の中間的な方法もある。

ソース・プログラム、中間形式、インタプリタのプロセス、CPU
図? コンパイラとインタプリタの併用によるプログラムの実行

◆C言語

◆Java言語

◆/bin/sh

■実習

実習時間中には、以下の課題をできるだけ多く行いなさい。全部を行う必要は ない。

★練習問題(1601) シェル変数の確認

setコマンドに引数付けないで実行すると、全てのシェル変数(環境変数含む)の 値が表示される。
$ set [←]
$ set | lv [←]
どのようなシェル変数が設定されているか観察しなさい。

★練習問題(1602) printenvコマンド

printenvtコマンドに引数付けないで実行すると、全ての環境変数の値が表示さ れる。これを確認しなさい。
$ printenv [←]
$ printenv | lv [←]

★練習問題(1603) 環境変数の確認

個々の環境変数の値がどうなっているか、echo コマンドや printenv コマンド で確認することができる。
$ echo $HOME [←]
/home/prof/yas
$ printenv HOME [←]
/home/prof/yas
$ []
注意: echo の引数には、$ を付けるが、 printenv の引数には、$ を付けない。

次のような環境変数の値を調べなさい。

注意:環境変数が設定されていないことがある。

★練習問題(1604) 環境変数 TZ の動作

次のようなコマンドを打ち、環境変数 TZ の働きを調べなさい。
$ date [←]
$ echo $TZ [←]
$ export TZ=EST    [←]
$ date [←]
$ unset TZ [←]
$ date [←]
$ []
環境変数 TZ/usr/share/zoneinfo/ の下にあるファイル名 を設定して、その動作を確認しなさい。

★練習問題(1605) 環境変数 HOME

環境変数 HOME の値を調べなさい。
$ echo $HOME [←]
cd コマンドの引数に与えて、ホーム・ディレクトリや ホーム・ディレクトリ以下のディレクトリに移動してみなさい。
$ cd / [←]
$ pwd [←]
$ cd $HOME [←]
$ pwd [←]
$ cd / [←]
$ pwd [←]
$ cd $HOME/Desktop [←]
$ pwd [←]
$ []
ファイル名の置き換え機能「~/」を使う方法と環境変数 HOME を使う方法を比 較しなさい。

★練習問題(1606) 環境変数 PATH

環境変数 PATH の働きを次のようにして調べなさい。
$ echo $PATH [←]
(表示を確認する)
$ aaaa [←]
-bash: aaaa: command not found     (エラーの表示)
$ ls [←]
(普通に実行される)
$ which ls [←]
/bin/ls
$ PATH=/usr/bin [←]
$ ls [←]
-bash: ls: command not found     (エラーの表示)
$ exit [←]
この例ではPATH の内容がかなり限定され、普段は実行できるコマンドが実行で きなくなっている。それで、最後に exit コマンドでシェルを終了している。 シェルが必要ならば、もう一度 iTerm を実行するなどしてシェルを実行する。

★練習問題(1607) シェル変数の操作

シェル変数を使って、長いファイル名やディレクトリ名を簡単に打ちなさい。
$ u=/Applications/Utilities [←]
$ echo $u [←]
/Applications/Utilities
$ ls $u [←]
Activity Monitor.app            Disk Utility.app
AirPort Utility.app             Grab.app
AppleScript Editor.app          Grapher.app
Audio MIDI Setup.app            Keychain Access.app
Bluetooth File Exchange.app     Migration Assistant.app
Boot Camp Assistant.app         System Information.app
BootPicker.app                  Terminal.app
ColorSync Utility.app           VoiceOver Utility.app
Console.app                     XQuartz.app
DigitalColor Meter.app
$ []

★練習問題(1608) 「*」のエスケープ

「*」は、シェルが解釈するメタキャラクタの1つである。 ファイル名置換 で、ファイル名に置換られる。
$ echo * [←]
(ファイル名の並び)
$ ls -ld * [←]
(ls -ld の結果)
$ []
次のようにして、「*」をエスケープして、ファイル名置き換えの動作を無効化 できることを確認しなさい。
 $ echo \*[←]
 *
 $ ls -ld \*[←]
 ls: *: No such file or directory
 (「*」というファイルが存在しないというエラー・メッセージ。エラーが出ることが正しい動作。)
 $ echo '*'[←]
 *
 $ ls -ld '*'[←]
 ls: *: No such file or directory
 $ echo "*"[←]
 *
 $ ls -ld "*"[←]
 ls: *: No such file or directory
 $ []

★練習問題(1609) 様々なシェルのメタキャラクタのエスケープ

練習問題 「*」のエスケープ と同様に、様々な メタキャラクタ を表示してみなさい。
$ echo '< > | { } ( ) [ ] & ; ^ " * ? ~'[←]
< > | { } ( ) [ ] & ; ^ " * ? ~
$ echo "< > | { } ( ) [ ] & ; ^ ' * ? ~"[←]
< > | { } ( ) [ ] & ; ^ ' * ? ~
$ echo \< \> \| \{ \} \( \) \[ \] \& \; \^ \" \* \? \~[←]
< > | { } ( ) [ ] & ; ^ " * ? ~
$ []

★練習問題(1610) 変数とクォートの働き

bash で ダブルクォート「" "」 や シングルクォート 「' '」の働きを調べなさい。
$ echo "$HOME" [←]
(表示の確認)
$ echo '$HOME' [←]
(表示の確認)

★練習問題(1611) historyコマンド

history コマンドで、どのようなコマンドを打ち込んできたかを調べなさい。
$ history [←]
$ history | tail -5 [←]
(過去の5行だけ表示)
$ history | grep cd [←]
(cd を含む行だけ表示)
$ history | lv [←]
(ページャ lv でページ単位で表示。)

★練習問題(1612) historyを使ったコマンドの実行

history の結果を用いて、過去のコマンドを再実行してみないさい。

★練習問題(1613) シェル変数 HISTFILESIZE

シェル変数 HISTFILESIZE の値を調べなさい。
$ echo $HISTFILESIZE [←]
history コマンドで表示されるコマンドの数を調べなさい。
$ history [←]
<表示>
$ history | wc [←]
$ []
wc は、word count の略で、行数、単語数、バイト数を表示する。一番左が行 数である。 シェル変数 HISTFILESIZE の値を変化させると、何が起きるか調べなさい。

★練習問題(1614) シェル変数 PS1

シェル変数 PS1 を表示しなさい。
crocus39:~ yas$ echo "$PS1"
\h:\W \u\$ 
crocus39:~ yas$ 
この時、ダブルクォート "" を付けないとうまく表示できないことがある。この理由を考えなさい。 シェル変数 PS1 は、シェルのプロンプトを保持している。これを変更してみな さい。
crocus39:~ yas$ PS1="hi$ "[←]
hi$ []

マニュアル man bash で、PS1 変数(PROMPTING)の中で次のような表現がどのような意味を 持っているかを調べなさい。

man bash の中では、ページャ lv (less) の 「/」 による検索が便利である。

★練習問題(1615) シェル変数と環境変数の比較

シェル変数と環境変数を比較しなさい。 練習問題 シェル変数の確認練習問題 printenvコマンド の結果を比較しなさい。変数を次の3つに分けて数を数えなさい。 シェル変数の方が数は多い。環境変数にしか現れないものは存在するか。
$ set | wc [←]
      53      67    1566
$ set | lv [←]
(表示省略。q で終了)
$ printenv | wc [←]
      24      29    1005
$ printenv | lv [←]
(表示省略。q で終了)
$ []

★練習問題(1616) クォートと改行

ダブルクォート「" "」 や シングルクォート 「' '」は、中に改行を含めることができる。逆に言うと、必ず閉じる 必要がある。閉じられていない場合には、シェルのプロンプトが$ から > に変化する。このことを確認しなさい。
$ echo "a [←]
> b[←]
> c"[←]
(表示の確認)
$ echo 'a [←]
> b[←]
> c'[←]
(表示の確認)
$ []

★練習問題(1617) ~/.bashrcの観察

自分のホーム・ディレクトリにある ~/.bashrc の内容を観察しなさい。
 $ cat ~/.bashrc[←]
 #
 # coins standard ~/.bashrc
 #
 if [ -f /usr/local/lib/standard/bashrc ]; then
	 . /usr/local/lib/standard/bashrc
 fi

 # add your own code below
 $ []

★練習問題(1618) 1行からなるシェル・スクリプトの作成

次の手順で 1 行からなるシェル・スクリプトを作成しなさい。

まず、端末で何かコマンドを実行しなさい。以下の例では、 /Applications/Calculator.app を実行している。

$ open /Applications/Calculator.app  [←]
(^p で1行もどす。^a で、行頭に移動して 「echo '」と打ち、^e して
「' >  run-calc」 と打つ)
$ echo 'open /Applications/Calculator.app'  > run-calc [←]
$ cat run-calc  [←]
open /Applications/Calculator.app
$ []
bash の機能で、^p (Control+P) で1行戻して、echo でファイルに落とす。 echo には、実行したコマンドを 「'シングルクォート'」で括る( '|') などして、エスケープして与えると安全である。

作成したファイルは、そのまま実行できる。

$ bash run-calc  [←]

いちいち bash と打たないでもいいようにするために、chmod コマンド で実行可能属性をつける。

$ ls -l run-calc  [←]
-rw-r--r--  1 yas  prof  34  6 16 15:08 run-calc
$ chmod +x run-calc  [←]
$ ls -l run-calc  [←]
-rwxr-xr-x  1 yas  prof  34  6 16 15:08 run-calc
$ ./run-calc  [←]
$ ~/run-calc [←]
$ []
エディタ(Emacs)で1行目に「#!/bin/bash」か「#!/bin/sh」を入れる。
#!/bin/bash
open /Applications/Calculator.app 

完成したコマンドを ~/bin に移動する。

$ mkdir ~/bin [←]
(注意: mkdir は、1度だけ実行すればよい。)
$ mv run-calc ~/bin [←]
$ run-calc [←]
$ []

★練習問題(1619) historyからのシェル・スクリプトの作成

複数行からなるシェル・スクリプトを作成しなさい。この場合、シェルにおけ る対話を保存するために echo コマンドではなく、history コ マンドを使う。
$ open /Applications/Firefox.app [←]
$ open /Applications/Thunderbird.app [←]
$ history [←]
(ヒストリの表示して、何行必要か数える。history コマンド自身の分、1行多く保存する。)
$ history |tail -4 > run-ft [←]
$ cat run-ft [←]
  512  open /Applications/Firefox.app
  513  open /Applications/MacPorts/Emacs.app
  514  history
$ emacs run-ft [←]
(不要な部分を削除する。1行目に #!/bin/bash と入れる。)
$ cat run-ft [←]
#!/bin/bash
open /Applications/Firefox.app
open /Applications/Thunderbird.app
$ ls -l run-ft [←]
-rw-r--r--  1 yas  prof  78  6 22 18:36 run-ft
$ cat run-ft [←]
#!/bin/bash
open /Applications/Firefox.app
open /Applications/Thunderbird.app
$ ls -l run-ft [←]
-rw-r--r--  1 yas  prof  78  6 22 18:36 run-ft
$ chmod +x run-ft [←]
$ ls -l run-ft [←]
-rwxr-xr-x  1 yas  prof  78  6 22 18:36 run-ft
$ ./run-ft [←]
$ ~/run-ft [←]
$ mkdir ~/bin [←]
(注意: mkdir は、1度だけ実行すればよい。)
$ mv run-ft ~/bin [←]
$ run-ft [←]
$ []

★練習問題(1620) fileコマンド

file コマンドは、ファイルの種類を推定して表示するコマンドである。ファイ ルの拡張子がなくても、画像や HTML 等を推定できる。
$ file .bashrc .emacs /bin/ls public_html/htdocs/index.html.en [←]
.bashrc:                          ASCII text
.emacs:                           Lisp/Scheme program text
/bin/ls:                          Mach-O 64-bit executable x86_64
public_html/htdocs/index.html.en: HTML document text
$ []

★練習問題(1621) シェル・スクリプトの例

/usr/bin には、C 言語で記述したソース・プログラムをコンパイルして作成し たプログラムの他に、シェル・スクリプト(主に/bin/sh)も含まれている。どの ようなシェル・スクリプトがあるかを調べなさい。
$ cd /usr/bin [←]
$ file * | grep shell [←]
$ []

そのプログラムが、一般のプログラム(機械語)かシェル・スクリプトかは、 file コマンドを使うと調べることができる。

 $ cd /usr/bin[←]
 $ ls -l apropos[←]
 -r-xr-xr-x  1 root  wheel  1808  5 19  2009 apropos
 $ file apropos[←]
 apropos: POSIX shell script text executable
 $ head apropos[←]
 #!/bin/sh
 #
 # apropos -- search the whatis database for keywords.
 # whatis  -- idem, but match only commands (as whole words).
 #
 # Copyright (c) 1990, 1991, John W. Eaton.
 # Copyright (c) 1994-1999, Andries E. Brouwer.
 #
 # You may distribute under the terms of the GNU General Public
 # License as specified in the README file that comes with the man
 $ []

★練習問題(1622) sortコマンド

sort コマンド は、データを並べ替えるプログラムである。データは、引数で指 定されたファイル、または、標準入力から受け取る。結果は、標準出力、また は、-o で指定されたファイルに書き出すプログラムである。

1行に1つ、なにかの名前(人名、果物の名前)を含むファイルを作成しなさい。 sort コマンドを使って、並べ替えなさい。

$ emacs fruits.txt [←]
$ sort  fruits.txt [←]
$ sort < fruits.txt [←]

sort コマンドでよく使うオプション

-n
数値として比較
-r
逆順でソート
-f
大文字小文字を区別しない
-k 番号
番号で指定されたフィールド以降をソートする。
-o filename
結果を filename に保存

★練習問題(1623) コマンド単体の復習

今日の課題では、シェル・スクリプトを作成するために今まで利用したコマンド を利用する。 次のようなコマンドの使い方を復習しなさい。

★練習問題(1624) 数字だけを表示するdate

date は、日本語の環境では「年月日」などを含めて表示する。これを数字だけを表 示するようなシェル・スクリプト date-num を作成しなさい。
$ date [←]
2018年 6月 6日 水曜日 19時59分41秒 EST
$ date-num [←]
2018-06-06
$ []
ヒント: man date と man strftime 参照。 date コマンドの + で、strftime の説明にある format string を指定する。

The UNIX Super Text 上巻 38.1 節の表 38-1 に間違いがある。

★練習問題(1625) 世界の都市の時刻を表示するdate

自分が関心がある世界の2つ以上の都市を選びなさい。それらの都市の現在時刻 を表示するシェル・スクリプトを作成しなさい。
$ date-cities [←]
Asia/Tokyo
2018年 6月 7日 木曜日 12時56分51秒 JST
Europe/London
2018年 6月 7日 木曜日 04時56分51秒 BST
America/New_York
2018年 6月 6日 水曜日 23時56分51秒 EDT
$ []

ヒント: date コマンドは、 環境変数の利用方法(TZ) で、表示を変化させる。

ヒント: 都市の情報は、/usr/share/zoneinfo/ にある。 夏時間(daylight saving time/summer time)により、 経度の標準からずれていることもある。

ヒント: 画面に都市名を表示するには、echo コマンドが使える。

★練習問題(1626) ディレクトリの属性を表示するls -l

ls -l にディレクトリ名を与えるとその内容が表示される。-d オプションを付 けると、ディレクトリ自身の属性が表示されるが、しばしばこのオプションを 忘れてしまう。そこで、次のようなシェル・スクリプト lldir を作成して、ディ レクトリの属性を簡単に表示するようにしなさい。
$ lldir ~ [←]
drwxr-xr-x  59 yas  prof  12288  6 16 15:37 /home/prof/yas
$ lldir / [←]
drwxrwxr-t  27 root  admin  1326  4 22 15:43 /
$ []

★練習問題(1627) platexを2回実行するシェル・スクリプト

platx コマンドは、参照を解決するためにしばしば2 回実行する必要がある。 それを簡単にするためのシェル・スクリプト l2 を作成しなさい。
$ l2 file [←]
ヒント: 引数には、拡張子 .tex 無しのファイル名を受け付けた方が、シェル スクリプトが簡単になる。

★練習問題(1628) platex、dvipdfmx、Preview.appの連続実行

platex コマンド、dvipdfmx コマンド、Preview.app (プレビュー.app) を次々と実行するシェル・スクリプトを作成しなさい。

$ lpshow file [←]
(画面には、file.pdf が Preview.app で表示される)
ヒント: 引数には、拡張子 .tex 無しのファイル名を受け付けた方が、シェル スクリプトが簡単になる。

ヒント: 拡張子 .pdf を持つファイルを open コマンドで開くと、標準では Preview.app が動作するが、他のプログラム(例えば Adobe Reader)にも変更で きる。この課題でも他のプログラムを使ってもよい。

★練習問題(1629) 「.」から始まるファイルだけを表示するls

ls コマンドや bash の * では、「.」から始まるファイルは表示されない。逆 に「.」から始まるファイルだけを表示する ls コマンドを作りなさい。
$ ls-dot ~ [←]
.
..
.bashrc
.emacs
.login
$ []
ヒント

方法1:シェルの ファイル名置換でよく使われるパタン を利用し、「.*」というパタンで探す。

方法2: ls に -a オプションを付けると、全てのファイルを表示し、 そのうち、先頭が「.」のものを抜き出す。 先頭が「.」のものを抜き出すには、 grep コマンドで次のパタンを検索する。

$ grep '^\.' [←]
abc[←]
.abc[←]
.abc
aaa[←]
.aaa[←]
.aaa
^D
$ []

余裕があれば、-l などのオプションが付けられるようにしなさい。

★練習問題(1630) ディレクトリだけを表示するls

ディレクトリだけを表示する ls コマンドを作りなさい。
$ lsd ~ [←]
Desktop/
Documents/
Downloads/
Library/
Mail/
Maildir/
Movies/
Music/
Pictures/
WinFiles/
bin/
public_html/
$ []
方法1: ls -F の結果から grep で「/」がついているものだけを抜き出す。

余裕があれば、-l などのオプションが付けられるようにしなさい。 余裕があれば、ls と同じように、ファイル名の順に並べ替えなさい。

★練習問題(1631) ファイルの行数の順に表示するwc

wc コマンド は、ファイルの行数、単語数、バイト数を表示する。wc コマンド は、引数で与えられた順に表示する。これを行数の順に表示するようなスクリ プトを作りなさい。
$ wc-lines *.c [←]
      85     228    1836 proc-uid-print.c
      75     187    1156 pipe-rw-dup.c
      50     152    1141 vaddr-print.c
      46     140    1071 proc-create.c
      67     161    1014 pipe-rw-nodup.c
      38      93     819 signal-int.c
      50      98     802 setjmp-longjmp.c
      32      90     561 run-n.c
      27      66     535 home-print.c
      20      50     424 cont-1.c
      20      50     424 cont-0.c
      25      60     419 t-system.c
      20      40     384 exec-date.c
      14      49     370 arg-print.c
      15      44     355 env-print.c
      12      32     305 cont-2.c
      13      16     174 fork-hello.c
       4      10      60 main-return.c
$ []
この課題では、合計(Total)は表示されなくてもよい。

ヒント:wc の出力を sort コマンドでソートする。for で1つずつ wc コマン ドを実行して、全体の結果を sort するか、引数 $* で wc した後、sort する。

★練習問題(1632) 使っているメモリのサイズが大きいプロセスの表示

ps aux では、全プロセス(a)が、サイズなどの情報も含めて(u)表示される。
$ ps aux [←]
USER       PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
root         1   0.0  0.0  2456708   1356   ??  Ss   火08AM    1:26.40 /sbin/la
yas       3549   0.0  0.0  2435468    980 s000  Ss    3:40PM   0:00.01 -bash
yas       3548   0.0  0.0  2450900    748   ??  S     3:40PM   0:00.00 /usr/sbi
yas       3546   0.0  0.0  2456124    672   ??  Ss    3:40PM   0:00.01 /sbin/la
root      3544   0.0  0.1  2450900   4700   ??  S     3:40PM   0:00.27 /usr/sbi
root      3543   0.0  0.0  2446148    820   ??  Ss    3:40PM   0:00.00 /usr/lib
...
root        54   0.0  0.6  2468840  25220   ??  Ss   火08AM    0:43.01 /usr/lib
root      3556   0.0  0.0  2434788    428 s000  R+    3:40PM   0:00.00 ps aux
$ []
そのうち、メモリのサイズ(RSS)が大きいプロセスを 10 個だけ表示するシェル・ スクリプトを作りなさい。
$ ps-rss-top10 [←]
USER       PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
root       318   0.0  3.0   215076 127388   ??  Ss   火08AM    1:12.05 /Library/
root       104   0.0  0.9  2567852  37332   ??  Ss   火08AM    0:41.42 /System/L
_windowserver  1007   0.0  0.6  2775984  25560   ??  Ss   火05PM    0:31.43 /Sys
root        54   0.0  0.6  2468840  25220   ??  Ss   火08AM    0:43.01 /usr/libe
root      1599   0.0  0.6 11156056  24040   ??  Ss   水02PM    0:09.13 /System/L
_mysql     218   0.0  0.5  2510832  18940   ??  S    火08AM    0:57.74 /opt/loca
_securityagent  1019   0.3  0.4  2757796  15396   ??  S    火05PM    7:51.89 /Sy
root       305   0.0  0.3   152008  14292   ??  S    火08AM    0:31.75 /Library/
root      1010   0.0  0.2  2727284   7956   ??  Ss   火05PM    0:03.56 /System/L
root      1050   0.0  0.2  2777952   7676   ??  Ss   火05PM    0:00.66 /System/L
$ []
ヒント:1行目は、そのまま表示する。RSS の順(第6フィールド)に sort して head する。

余裕があれば、VSZ の順、CPU 時間の順に表示するスクリプトを作りなさい。

類似のことを実行するプログラムとして top がある。

★練習問題(1633) バックアップ・ファイルとのdiff

emacs は、ファイルを保存する時に、1つの前のバージョンを「~」を 付けて保存する。そのようなファイルを見つけて、オリジナルのファイルと diff コマンドで比較するようなスクリプトを作りなさい。
$ diff-backup kadai10.txt [←]
余裕があれば、比較しているファイルの名前を表示したり、ファイルごとに停 止する、引数を取る、diff に対するオプションを取る、などの工夫をしなさ い。

★練習問題(1634) coins標準の bashrc の観察

自分のホーム・ディレクトリにある ~/.bashrc は、coins 標準のbashrc を「.」 コマンド (source コマン)ドで読み込んでいる。その読み込んでいる先のファ イルでどのような設定がなされているかを観察しなさい。
$ lv ~/.bashrc [←]
$ lv /usr/local/lib/standard/bashrc [←]
環境変数 PATHの値を観察しなさい。
$ echo $PATH [←]
環境変数 PATH に含まれているディレクトリには、どのようなコマンドがある かを調べなさい。例えば、/usr/local/bin を調べるには、次のようにする。
$ ls /usr/local/bin [←]
PATH 以外にどのような シェル変数と環境変数 が設定されているかを調べなさい。
$ set [←]
(全てのシェル変数と環境変数の表示)
$ set | lv [←]
(全てのシェル変数と環境変数の表示。lv によるページ単位の表示。)
$ printenv [←]
(環境変数の表示)
$ printenv | lv [←]
(環境変数の表示。lv によるページ単位の表示。)
$ []

★練習問題(1635) ~/.bashrcでのシェル変数の登録

シェルに対してよく打ち込む長い文字列を、~/.bashrc で シェル変数に設定 してみなさい。

注意: ~/.bashrcの編集は慎重に に行うこと。 もし ~/.bashrc に間違いが含まれた場合、iTerm が開かなくなる等の問題が生 じることがある。(iTerm でウィンドウを開いても、すぐに bash が終了 してしまうことがある。)

~/.bashrc に alias の定義を追加しても、既に実行しているシェルには反映さ れない。実行しているシェルに反映させるには、「.」コマンドを用いる。 ~/.bashrcの編集結果の反映参照。

★練習問題(1636) エイリアス ll の定義

以下の例を真似て、bash の alias 機能を用いてls -l の代わりに ll というコマンドを使えるようにしなさい。

$ ls -l [←]
total 80
-rw-r--r--  1 yas  prof  36224  6 16 16:24 index.html
-rw-r--r--  1 yas  prof   4459  6 16 16:24 screen-tab.png
$ ll [←]
-bash: ll: command not found
          # この時点ではコマンドは見つからない
$ alias ll='ls -l' [←]
          # alias による ll コマンドの定義
$ ll [←]
total 80
-rw-r--r--  1 yas  prof  36224  6 16 16:24 index.html
-rw-r--r--  1 yas  prof   4459  6 16 16:24 screen-tab.png
$ []

★練習問題(1637) bash alias 関連のコマンド

bash の alias 関連のコマンドを利用してみなさい。
一覧表示
alias コマンドを引数なしで実行する。例:
$ alias [←]
単独表示
alias コマンドに名前を引数として与える。例:
$ alias ll [←]
定義
alias コマンドに「名前='定義内容'」 を引数として与える。例:
$ alias ll='ls -l' [←]
削除
unalias コマンドに名前を引数として与える。例:
$ unalias ll [←]

★練習問題(1638) bashのエイリアスの~/.bashrcへの登録

bash の alias は、定義したシェルでのみ有効である。 全部のシェルで有効にするためには、 ~/.bashrc に登録する必要がある。

注意: ~/.bashrcの編集は慎重に に行うこと。 もし ~/.bashrc に間違いが含まれた場合、iTerm が開かなくなる等の問題が生 じることがある。(iTerm でウィンドウを開いても、すぐに bash が終了 してしまうことがある。)

~/.bashrc に alias の定義を追加しても、既に実行しているシェルには反映さ れない。実行しているシェルに反映させるには、「.」コマンドを用いる。 ~/.bashrcの編集結果の反映参照。

 $ cat ~/.bashrc
 #
 # coins standard ~/.bashrc
 #
 if [ -f /usr/local/lib/standard/bashrc ]; then
	 . /usr/local/lib/standard/bashrc
 fi

 # add your own code below

 alias ll='ls -l'
          # ~/.bashrc に ll を追加した
 $ ll[←]
 bash: ll: command not found
          # 追加しただけでは、コマンドは見つからない
 $ . ~/.bashrc[←]
          # 「.」コマンドで、~/.bashrc を読み込む
 $ ll
 (ls -l の表示)
          # ll コマンドが有効になっている。
 $ []

★練習問題(1639) 1行からなるエイリアスの定義

1行からなるシェル・スクリプトと同様に、1行からなるエイリアスを定義しなさい。

★練習問題(1640) LANGを変更するalias

環境変数LANGを次のものに変更するようなalias を定義しなさい。

★練習問題(1641) Cプログラムのコンパイルと実行

ccコマンド」 の所で用いたhello.c をコピーし、コ ンパイルし、実行しなさい。

★練習問題(1642) Javaプログラムのコンパイルと実行

javac コマンドと java コマンド」で用いた Hello.java をコピーし、コンパイルして実行しなさい。

■課題16 シェル変数、環境変数、シェル・スクリプト

以下の問題、および、回答をテキスト・ファイルに記述し、 レポート提出ページから提出しなさい。

(1) 学類の iMac で、MacOSX が動作している状態で、次のファイル名(ディレ クトリ名も含めたすべて)を、適当なシェル変数を設定して短く表現しなさい。

    /Applications/Firefox.app
    /Applications/Thunderbird.app
    /Applications/QuickTime Player.app
    /Applications/MacPorts/Emacs.app
短く表現したものを、ls -ld コマンドの引数に与えて実行しなさい。
$ シェル変数の代入1 [←]
$ シェル変数の代入2 [←]
$ シェル変数の代入3 [←]
...
$ シェル変数の代入n [←]
$ ls -ld シェル変数の参照を利用短い表現 [←]
drwxrwxr-x@ 3 root  admin  102  5 25 09:50 /Applications/Firefox.app
$ ls -ld シェル変数の参照を利用短い表現 [←]
drwxrwxr-x@ 3 root  admin  102  6  7 09:43 /Applications/Thunderbird.app
$ ls -ld シェル変数の参照を利用短い表現 [←]
drwxr-xr-x+ 3 root  wheel  102  7 21  2016 /Applications/QuickTime Player.app
$ ls -ld シェル変数の参照を利用短い表現 [←]
drwxr-xr-x  3 root  admin  102  4 27 07:10 /Applications/MacPorts/Emacs.app
$ []
ヒント1: シェル変数への代入は、何回でもよい。1回でも2回以上でもよい。

ヒント2: シェル変数の値に空白が含まれている(可能性がある)ものを参照する 時には、ダブルクォートでくくる("$name")とよい。

ヒント3: 補完機能と組み合わせてもよい。その場合にはどのようなキー操作を したのかをレポートに書きなさい。

練習問題 シェル変数の操作練習問題 変数とクォートの働き 参照

(2) echo コマンドを使って、次の文字列を画面に表示しなさい。

Lib*
????top
A   B #AとBの間に空白が3個
<yes><no>
Let's go
#help
たとえば、次のように回答しなさい。
$ echo 回答内容 [←]
Lib*
$ echo 回答内容 [←]
????top
$ echo 回答内容 [←]
A   B
$ echo 回答内容 [←]
<yes><no>
$ echo 回答内容 [←]
Let's go
$ echo 回答内容 [←]
#help
$ []
注意:これは、 メタキャラクタをエスケープ する課題である。単に echo コマンドに対してこのような文字列を与えればよ いということでない。 練習問題 「*」のエスケープ練習問題 様々なシェルのメタキャラクタのエスケープ 参照。

(3) 練習問題(1624) から 練習問題(1633) まで から1つ選んでシェル・スクリプトを作成しなさい。 作成したシェル・スクリプトを、ディレクトリ ~/bin に起きなさい。 作成したシェル・スクリプトについて、次のことを書きなさい。

練習問題 1行からなるシェル・スクリプトの作成練習問題 historyからのシェル・スクリプトの作成 参照。

(4) 筑波大学全学計算機システム の「共通科目「情報」手引き 2018年度電子版」 の次の部分を読みなさい。

そして次の点について、次の項目について簡単に説明しなさい。

(5) [加点] ~/.bashrc に対してエイリアス、シェル変数、または関数を「2つ」 定義して追加しなさい。定義したものについて、それぞれ次のことを書きなさ い。

ただし、この Web ページの中で例として示したものを定義して追加してはなら ない。それ以外のものを定義して追加し、報告しなさい。

注意: ~/.bashrcの編集は慎重に 行うこと。それにエラー が含まれていると、iTerm のウインドウが開かなくなる(bashがすぐに終了して しまう)等の問題が生じる。

(8) [加点] 新Linux/UNIX入門の次のコマンドの使い方を調べなさい。

これらのコマンドから 2 つ以上選びなさい。そして、各コマンドを利用したシェ ル・スクリプトを作成しなさい。合計で 2 つ以上のシェル・スクリプトを作成 することになる。1つのシェルスクリプトの中で2つ以上のコマンドを利用して もよいが、その場合は、1つのシェル・スクリプトとして数える。作成したシェ ル・スクリプトについて、(3) と同様の内容をレポートに含めなさい。


Last updated: 2018/06/07 18:35:26
Yasushi Shinjo / <yas@cs.tsukuba.ac.jp>