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/
$ 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
$ X=100
...
$ export X
$
あるいは、最初から export を付けて代入の操作をすることもできる。
$ export X=100
$
bash では、環境変数の参照方法と削除方法はシェル変数と同じ($
とunset)である。
$ 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
$
date
コマンドは、TZ
が設定されていないと、そのコン
ピュータの標準(coins では、JST
、Japan Standard Time の意味)を利
用して日時を表示する。
$ 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]](../icons/screen-tab.gif)
$ ls -ld /Applications/
$ ls -ld /Applications/Q
$ ls -ld /Applications/Q![[tab]](../icons/screen-tab.gif)
$ 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
$
$ 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
1 saykotoeri2
2 saykotoeri2
3 fg
4 dup
<中略>
500 history
$
シェル変数 HISTFILESIZE の個数だけ記憶している。
$ echo $HISTFILESIZE
500
$
$ 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 (Bourne-Again SHell) は、sh (Bourne Shell)の機能を強化したもの。 シェル・スクリプトを書く時には、多くのシステムで備わっている /bin/sh を 使うことも多い。(/bin/sh はあるが /bin/bash がないシステムもある。)
例:サイズが大きいファイルの上位 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
$
シェル・スクリプトを実行する度にいちいち「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
$
~/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
」で実行可能になる。
シェル・スクリプトを実行する時に、シェル・スクリプトに対して引数を与え ることができる。 新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
$
$1,$2,...
で参照できる。
$*
では、全ての引数を参照できる。
$#
で引数の数がわかる。
shift
コマンドで引数をずらすことができる。
a b c
が与えられた時の実行例。
$ echo $#
3
$ echo $1 $2 $3
a b c
$ shift
$ echo $#
2
$ echo $1 $2 $3
b c
$
#
」を使ってコメントを書くことができる。bash は、
文字「#
」移行、行末まで無視する。
$ echo a b # c d
a b
$ # echo a b c
$
$ 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
という名前のファイルにあるプログラムを自動的
に実行する。~/.bashrc
では、次のようなことを行う。
~/.bashrc を編集したら、一度、iTerm のウィンドウを問題なく開けるか、確 認すると良い。
~/.bashrc に問題があり、iTerm のウィンドウが開かなくなった時には、次の ような方法で修正する。
$ 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
$ source ~/.bashrc
~/.bashrc
に保存する。
以下の例は、ssh でよくアクセスするホストをシェル変数に登録している。
$ cat ~/.bashrc
...
coins=coins.tsukuba.ac.jp
www=www.$coins
icho=icho.u.tsukuba.ac.jp
...
$
これを使うと、ssh が簡単になる。
$ ssh $www
$ ssh $icho
~/.bashrc
などを設定して、~/bin
を
環境変数PATH
に含まれ
るようにすることを奨める。自分で作成したプログラムやシェル・スクリプトを
~/bin
に置くと、ファイル名を指定しなくても
(「~/ファイル名
」や
「./ファイル
」打たなくて)、
~/bin
以下の短いファイル名で実行できるようになる。
coins では、標準で ~/bin
が PATH
に含まるように設定されて
いるので、各自設定する必要はない。
図? コンパイラ方式でのプログラムの実行
図? インタプリタ方式でのプログラムの実行
コンパイラ方式とインタプリタ方式の中間的な方法もある。
図? コンパイラとインタプリタの併用によるプログラムの実行
$ set
$ set | lv
どのようなシェル変数が設定されているか観察しなさい。
$ printenv
$ printenv | lv
$ echo $HOME
/home/prof/yas
$ printenv HOME
/home/prof/yas
$
注意: echo
の引数には、$
を付けるが、
printenv
の引数には、$
を付けない。
次のような環境変数の値を調べなさい。
$ date
$ echo $TZ
$ export TZ=EST
$ date
$ unset TZ
$ date
$
環境変数 TZ
に /usr/share/zoneinfo/
の下にあるファイル名
を設定して、その動作を確認しなさい。
$ echo $HOME
cd コマンドの引数に与えて、ホーム・ディレクトリや
ホーム・ディレクトリ以下のディレクトリに移動してみなさい。
$ cd /
$ pwd
$ cd $HOME
$ pwd
$ cd /
$ pwd
$ cd $HOME/Desktop
$ pwd
$
ファイル名の置き換え機能「~/」を使う方法と環境変数 HOME を使う方法を比
較しなさい。
$ 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 を実行するなどしてシェルを実行する。
$ 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
$
$ 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
$
$ echo '< > | { } ( ) [ ] & ; ^ " * ? ~'
< > | { } ( ) [ ] & ; ^ " * ? ~
$ echo "< > | { } ( ) [ ] & ; ^ ' * ? ~"
< > | { } ( ) [ ] & ; ^ ' * ? ~
$ echo \< \> \| \{ \} \( \) \[ \] \& \; \^ \" \* \? \~
< > | { } ( ) [ ] & ; ^ " * ? ~
$
" "
」 や シングルクォート
「' '
」の働きを調べなさい。
$ echo "$HOME"
(表示の確認)
$ echo '$HOME'
(表示の確認)
$ history
$ history | tail -5
(過去の5行だけ表示)
$ history | grep cd
(cd を含む行だけ表示)
$ history | lv
(ページャ lv でページ単位で表示。)
!
の後に番号
!!
^P
/^N
で選択して $ echo $HISTFILESIZE
history コマンドで表示されるコマンドの数を調べなさい。
$ history
<表示>
$ history | wc
$
wc は、word count の略で、行数、単語数、バイト数を表示する。一番左が行
数である。
シェル変数 HISTFILESIZE の値を変化させると、何が起きるか調べなさい。
crocus39:~ yas$ echo "$PS1"
\h:\W \u\$
crocus39:~ yas$
この時、ダブルクォート ""
を付けないとうまく表示できないことがある。この理由を考えなさい。
シェル変数 PS1 は、シェルのプロンプトを保持している。これを変更してみな
さい。
crocus39:~ yas$ PS1="hi$ "
hi$
マニュアル man bash で、PS1 変数(PROMPTING)の中で次のような表現がどのような意味を 持っているかを調べなさい。
\h
\W
\u
$ set | wc
53 67 1566
$ set | lv
(表示省略。q で終了)
$ printenv | wc
24 29 1005
$ printenv | lv
(表示省略。q で終了)
$
" "
」 や シングルクォート 「'
'
」は、中に改行を含めることができる。逆に言うと、必ず閉じる
必要がある。閉じられていない場合には、シェルのプロンプトが$
から
>
に変化する。このことを確認しなさい。
$ echo "a
> b
> c"
(表示の確認)
$ echo 'a
> b
> c'
(表示の確認)
$
$ cat ~/.bashrc
#
# coins standard ~/.bashrc
#
if [ -f /usr/local/lib/standard/bashrc ]; then
. /usr/local/lib/standard/bashrc
fi
# add your own code below
$
まず、端末で何かコマンドを実行しなさい。以下の例では、 /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
$
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
$
$ 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
$
$ 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
$
1行に1つ、なにかの名前(人名、果物の名前)を含むファイルを作成しなさい。 sort コマンドを使って、並べ替えなさい。
$ emacs fruits.txt
$ sort fruits.txt
$ sort < fruits.txt
sort コマンドでよく使うオプション
$ 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 に間違いがある。
$ 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 コマンドが使える。
$ 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 /
$
$ l2 file
ヒント: 引数には、拡張子 .tex 無しのファイル名を受け付けた方が、シェル
スクリプトが簡単になる。
$ lpshow file
(画面には、file.pdf が Preview.app で表示される)
ヒント: 引数には、拡張子 .tex 無しのファイル名を受け付けた方が、シェル
スクリプトが簡単になる。
ヒント: 拡張子 .pdf を持つファイルを open コマンドで開くと、標準では Preview.app が動作するが、他のプログラム(例えば Adobe Reader)にも変更で きる。この課題でも他のプログラムを使ってもよい。
$ ls-dot ~
.
..
.bashrc
.emacs
.login
$
ヒント
方法1:シェルの ファイル名置換でよく使われるパタン を利用し、「.*」というパタンで探す。
方法2: ls に -a オプションを付けると、全てのファイルを表示し、 そのうち、先頭が「.」のものを抜き出す。 先頭が「.」のものを抜き出すには、 grep コマンドで次のパタンを検索する。
$ grep '^\.'
abc
.abc
.abc
aaa
.aaa
.aaa
^D
$
余裕があれば、-l などのオプションが付けられるようにしなさい。
$ lsd ~
Desktop/
Documents/
Downloads/
Library/
Mail/
Maildir/
Movies/
Music/
Pictures/
WinFiles/
bin/
public_html/
$
方法1: ls -F の結果から grep で「/」がついているものだけを抜き出す。
余裕があれば、-l などのオプションが付けられるようにしなさい。 余裕があれば、ls と同じように、ファイル名の順に並べ替えなさい。
$ 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 する。
$ 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 がある。
$ diff-backup kadai10.txt
余裕があれば、比較しているファイルの名前を表示したり、ファイルごとに停
止する、引数を取る、diff に対するオプションを取る、などの工夫をしなさ
い。
$ 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 によるページ単位の表示。)
$
~/.bashrc に alias の定義を追加しても、既に実行しているシェルには反映さ れない。実行しているシェルに反映させるには、「.」コマンドを用いる。 ~/.bashrcの編集結果の反映参照。
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
$
$ alias
$ alias ll
名前='定義内容'
」
を引数として与える。例:
$ alias ll='ls -l'
$ unalias ll
~/.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 コマンドが有効になっている。
$
echo
でファイルに落すのではなく、alias
コマンドでエ
イリアスを定義する。
~/.bashrc
に追加する。
(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つ」 定義して追加しなさい。定義したものについて、それぞれ次のことを書きなさ い。
注意: ~/.bashrcの編集は慎重に 行うこと。それにエラー が含まれていると、iTerm のウインドウが開かなくなる(bashがすぐに終了して しまう)等の問題が生じる。
(8) [加点] 新Linux/UNIX入門の次のコマンドの使い方を調べなさい。