2010年04月30日 情報科学類 コンピュータリテラシ 筑波大学 システム情報工学研究科 コンピュータサイエンス専攻, 電子・情報工学系 新城 靖 <yas@is.tsukuba.ac.jp>
このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~yas/coins/literacy-2010/2010-04-30
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~yas/
http://www.cs.tsukuba.ac.jp/~yas/
C-x C-c
で終了させること。また、シェルを終
了させても、iTerm は終了していないことがあるので、明示的に終了させる。
$ ls -l > file1
シェルは、「記号<」 があると、標準入力をキーボードから指定され
たファイルに切り替え、指定されたプログラムを実行する。
$ cat < file1
シェルは、「記号|
」があると、次の動作を行う (パイプ(pipe)機能)。
|
」の左のプログラム(プロセス)の標準出力を、右のプログ
ラム(プロセス)の標準入力に(ファイルを介することなく)接続する。
$ ls -l | head -4
total 222
drwx------ 10 yas prof 4096 4 26 18:51 Desktop
drwx------ 4 yas prof 4096 4 2 14:14 Documents
drwxr-xr-x@ 2 yas prof 4096 4 26 12:51 Downloads
$
ファイルを介しても類似の操作は可能だが、後で不要なファイルを消さなけれ
ばならない。
$ ls -l > file
$ head -4 < file
total 222
drwx------ 10 yas prof 4096 4 26 18:51 Desktop
drwx------ 4 yas prof 4096 4 2 14:14 Documents
drwxr-xr-x@ 2 yas prof 4096 4 26 12:51 Downloads
$ rm file
$
パイプは、3つ以上のプログラム(プロセス)を結びつけることもできる。
$ ls Document > file
ls: Document: No such file or directory
$ cat file
$
「Document
」 は、「Documents
」の打ち間違い(sがない)である。
ls コマンドは、エラー・メッセージを標準出力ではなく標準エラー出力に書き
出す。
「2>file
」をつかうと、標準エラー出力をファイルに保存
することもできる。
$ ls Document > file 2>file2
$ cat file
$ cat file2
ls: Document: No such file or directory
$
「2>&1
」をつかうと、標準エラー出力(2)を、標準出力
(1)に混ぜて(&
)、ファイルに保存することもできる。
$ ls Document > file 2>&1
$ cat file
ls: Document: No such file or directory
$
「2>&1
」は、順番が大事。ファイルに混ぜて保存する場合
は、「>file
」の後にやること。先にやると、その時点で
の標準出力(画面)が指定されてしまう。
$ ls Document 2>&1 > file
ls: Document: No such file or directory
$ cat file
$
2>&1
を使うと、エラー・メッセージも含めてパイプに出力
することもできる。この場合は、パイプ|
より左に書く。
$ ls Document 2>&1 | head -4
ls: Document: No such file or directory
$
変数名=値
」を使う。
$ X=100
$
参照するには、「$変数名
」、または、
「"$変数名"
」(ダブルクォートで括る)とする。
$ X=100
$ echo $X
100
$ echo x"$X"x
x100x
$
シェル変数を削除するには、unset コマンドを使う。
$ unset X
$ echo $X
$ echo x"$X"x
xx
$
設定されていないシェル変数を使おうとすると、空として扱われる。
注意:シェルのプロンプト($
) と間違えないこと。シェルのプロンプ
ト($
) は、実際のコンピュータでは、cosmos38:~ i1012345$
のようになっている。
$ X=100
...
$ export X
$
あるいは、最初から export を付けて代入の操作をすることもできる。
$ export X=100
$
bash では、環境変数の参照方法と削除方法はシェル変数と同じ($
とunset)である。
$ date
2010年 4月29日 木曜日 11時29分16秒 JST
$ echo $TZ
$ TZ=EST
$ export TZ
$ echo $TZ
EST
$ date
2010年 4月28日 水曜日 21時29分44秒 EST
$ unset TZ
$ date
2010年 4月29日 木曜日 11時30分10秒 JST
$
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
$
補完(completion)では、人間が目で確認するが、置き換えでは人間が確認する ことはない(見つからなければエラーになる)。
例:/usr/bin
にある at
で始まるファイルをすべて
ls
コマンドに引き渡したい。1つひとつ打つと疲れる。
$ ls /usr/bin/at /usr/bin/atos /usr/bin/atq /usr/bin/atrm /usr/bin/atsutil
/usr/bin/at /usr/bin/atq /usr/bin/atsutil
/usr/bin/atos /usr/bin/atrm
$
次のように、「*
」を使うと楽に打てる。
$ ls /usr/bin/at*
/usr/bin/at /usr/bin/atq /usr/bin/atsutil
/usr/bin/atos /usr/bin/atrm
$
この例では、シェルが「/usr/bin/at*
」を5つのファイル名に置き換え
ている。ls
が行っているのではない。ls
以外のどんなプログラ
ムでも有効である。
$ echo /usr/bin/at*
/usr/bin/at /usr/bin/atos /usr/bin/atq /usr/bin/atrm /usr/bin/atsutil
$ file /usr/bin/at*
/usr/bin/at: setuid Mach-O fat file with 3 architectures
/usr/bin/atos: Mach-O fat file with 2 architectures
/usr/bin/atq: setuid Mach-O fat file with 3 architectures
/usr/bin/atrm: setuid Mach-O fat file with 3 architectures
/usr/bin/atsutil: Mach-O fat file with 3 architectures
$
パタン | 意味 |
* | 任意の文字列(空でもよい)(.で始まるものを除く) |
? | 任意の1文字 |
[str] | strのなかの1文字。たとえば [aA] は、a か A とマッチする。「-」があると、ASCIIでその間の文字を意味する。たとえば [0-9](数字)や[a-zA-Z](アルファベット)がよく使われる。 |
{str1,str2,...} | 「,」で区切られたパタン str1, str2, ... を順にファイル名置換した結果を並べたもの |
~username | ユーザusernameのホーム・ディレクトリの絶対パス。 |
~/ | 自分自身のホーム・ディレクトリ |
~ | 自分自身のホーム・ディレクトリ |
よく使われる形式
*
」と「*.*
」は違う。Windowsで「*.*
」と書く
所、Unixでは、「*
」で十分なことが多い。
$ history
1 saykotoeri2
2 saykotoeri2
3 fg
4 dup
...
500 history
$
シェル変数 HISTFILESIZE の個数だけ記憶している。
$ echo $HISTFILESIZE
500
$
^P
/ ^N
で、ヒストリを
さかのぼれる。
その他に、次のような方法もある。bash では、ほとんど使われない。編集機能 がないシェルでは有効であった。
$ 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
$
Emacs には、C-x C-s で明示的にファイルに保存しなても、ある程度
編集をすると、自動的に保存する機能がある。たとえば、
「file1.txt
」
というファイルを編集していると、前後に#
が付いた
「#file1.txt#
」
というファイルが作られる。レポート提出時にこれを提出してはならない。自
動保存のファイルの文字コードは、EUC でも Shift_JIS でも JIS でも UTF-8
でもなく、Emacs 独自のものである。
M-x
の後)を打つ時にも、補完機能がある。
bash の補完機能は、Emacs をまねて作られた。
$ cal 5 2010
5月 2010
日 月 火 水 木 金 土
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
$ cal 5 2010 > cal-2010-05.txt
$ cat cal-2010-05.txt
5月 2010
日 月 火 水 木 金 土
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
$
動作例:
$ bc
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
10+20
30
^D
$
bc コマンドは、プロンプトを表示しないが、ユーザが打ち込んだ数式を行単位
で計算して表示する。終了するには、入力の終わり(end of file) を意味する
^D
(Control+D) を押す。コントロール・キーを押しながら、
D キーを押す。
次のような機能が利用できる。
bc に -l
オプションを付けると小数が扱える。
詳しくは、man bc を見なさい。
$ cat > expressions
10+20
2^40
^D
$ cat expressions
10+20
2^40
$
次に作成した数式を、
キーボードの代わりにファイルからデータを読み込ませる。
$ bc < expressions
30
1099511627776
$
$ ls -l cal-2010-567.txt
ls: cal-2010-567.txt: No such file or directory
$ cal 5 2010 > cal-2010-567.txt
$ cal 6 2010 >> cal-2010-567.txt
$ cal 7 2010 >> cal-2010-567.txt
$ cat cal-2010-567.txt
5月 2010
日 月 火 水 木 金 土
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
6月 2010
日 月 火 水 木 金 土
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
7月 2010
日 月 火 水 木 金 土
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
$
$ ls /ここまで打ったら、行末で![]()
^I
(Control+I))を1度押してみる。
$ ls /1度目は何も表示が変わらない。bash や端末の設定によっては、ベルが鳴る。 行末で![]()
$ ls /すると、ls と同じような表示がなされる。![]()
$ ls / .DS_Store Developer/ home/ .Spotlight-V100/ Library/ local3/ .SymAVx86QSFile Network/ mach_kernel .Trashes/ Pref-data/ net/ .file System/ opt/ .fseventsd/ Users/ private/ .hotfiles.btree Volumes/ sbin/ .metadata_never_index bin/ tmp/ .symSchedScanLockxz cores/ usr/ .vol/ dev/ var/ Applications/ etc/ $ ls /目的の「![]()
usr
」は、u
から始まるものは、1個しかないので 「u」
とうち、% ls /uすると、![]()
sr/
が補完される。
% ls /usr/「![]()
% ls /usr/すると、/usr の内容が表示される。![]()
$ ls /usr/ X11/ bin/ lib/ local/ sbin/ standalone/ X11R6/ include/ libexec/ local3/ share/ $ ls /usr/「![]()
b
% ls /usr/b次のように「![]()
in/
」が補完される。
$ ls /usr/bin/「![]()
/usr/bin/
」に対して、「$ ls /usr/bin/候補が多すぎるので、ここでは表示はしないでDisplay all 1093 possibilities? (y or n)
![]()
n
を打つ。
Display all 1093 possibilities? (y or n)n
em
と入れて $ ls /usr/bin/emすると、次のように「![]()
acs
」が補完される。
$ ls /usr/bin/emacsこれで目的のファイルを打ち込むことができた。![]()
Emacs の補完機能を確認しなさい。
C-x C-f
でファイルを開く
~/.emacs
等の起動時に実行されるファイルに含める方法がある。
こうすると、ファイル名に空白を使いにくくなる。
(if (boundp 'minibuffer-local-filename-completion-map) (define-key minibuffer-local-filename-completion-map " " 'minibuffer-complete-word)) (if (boundp 'minibuffer-local-must-match-filename-map) (define-key minibuffer-local-must-match-filename-map " " 'minibuffer-complete-word))
$ set
どのようなシェル変数が設定されているか観察しなさい。
$ printenv
$ echo $HOME
/home/prof/yas
$ printenv HOME
/home/prof/yas
$
注意: printenv
の引数には、$
を付けない。
次のような環境変数の値を調べなさい。
$ date
$ echo $TZ
$ export TZ=EST
$ date
$ unset TZ
$ date
$
環境変数 TZ
に /usr/share/zoneinfo/
の下にあるファイル名
を設定して、その動作を確認しなさい。
$ head /etc/services
#
# Network services, Internet style
#
# Note that it is presently the policy of IANA to assign a single well-known
# port number for both TCP and UDP; hence, most entries here have two entries
# even if the protocol doesn't support UDP operations.
#
# The latest IANA port assignments can be gotten from
#
# http://www.iana.org/assignments/port-numbers
$ tail /etc/services
isnetserv 48128/tcp # Image Systems Network Services
isnetserv 48128/udp # Image Systems Network Services
blp5 48129/tcp # Bloomberg locator
blp5 48129/udp # Bloomberg locator
# 48130-48555 Unassigned
com-bardac-dw 48556/udp # com-bardac-dw
com-bardac-dw 48556/tcp # com-bardac-dw
# Nicholas J Howes
# 48557-49150 Unassigned
# 49151 IANA Reserved
$
このコマンドの動きを確認しなさい。引数として他のファイル名(自分が作成
したレポート等)を指定して実行してみなさい。
/etc/passwd
」の中にある「root
」とい
う文字を含む行を表示している。
$ grep root /etc/passwd
root:*:0:0:System Administrator:/var/root:/bin/sh
daemon:*:1:1:System Services:/var/root:/usr/bin/false
_cvmsroot:*:212:212:CVMS Root:/var/empty:/usr/bin/false
$
同じことを、パイプを使っても実行することができる。
$ cat /etc/passwd | grep root
root:*:0:0:System Administrator:/var/root:/bin/sh
daemon:*:1:1:System Services:/var/root:/usr/bin/false
_cvmsroot:*:212:212:CVMS Root:/var/empty:/usr/bin/false
$
grep コマンドを使って次のようなことを行ってみなさい。
/etc/services
にある http
が含まれる行
/etc/services
にある pop
が含まれる行
/etc/services
にある imap
が含まれる行
ls
が含まれる行
grep コマンドには次のようなオプションを指定することができる。
1行に1つ、なにかの名前(人名、果物の名前)を含むファイルを作成しなさい。 sort コマンドを使って、並べ替えなさい。
$ emacs fruits.txt
$ sort fruits.txt
$ sort < fruits.txt
ls -l の結果は、ファイル名の順番でソートされている。これをファイルの大 きさでソートしなさい。
$ ls -l | sort -k 5
sort コマンドでよく使うオプション
% ls -l /usr/bin | lv
% grep yes /usr/share/dict/words | lv
% tail /usr/share/dict/words | sort -r
% ls
% ls | cat
% ls | lv
パイプに出力する時にも、画面と同様の表示をさせるには、-C オプションを付
ければよい。
% ls -C
% ls -C | cat
% ls -C | lv
$ u=/Applications/Utilities
$ echo $u
/Applications/Utilities
$ ls $u
Activity Monitor.app Grapher.app
Adobe Utilities.localized Java Preferences.app
AirPort Utility.app Keychain Access.app
AppleScript Editor.app Migration Assistant.app
Audio MIDI Setup.app Network Utility.app
Bluetooth File Exchange.app Podcast Capture.app
Boot Camp Assistant.app RAID Utility.app
ColorSync Utility.app Remote Install Mac OS X.app
Console.app Spaces.app
DigitalColor Meter.app System Profiler.app
Disk Utility.app Terminal.app
Expose.app VoiceOver Utility.app
Grab.app X11.app
$
% history
次の方法で再実行してみないさい。
^P
/^N
で選択して !
の後に番号
$ ls -l ~/Library/*/Firefox/Profiles/*/.parentlock
-rw-r--r-- 1 yas prof 0 4 27 15:21 /home/prof/yas/Library/Application Support/Firefox/Profiles/019kso7s.default/.parentlock
$ ls -l ~/L
以後、補完機能を使いながら打つ
Profiles の下には、.default/があるものを選ぶ
そのディレクトリの下では、.p
を選ぶ
$ ls -l ~/Library/Application\ Support/Firefox/Profiles/019kso7s.default/.parentlock
-rw-r--r-- 1 yas prof 0 4 27 15:21 /home/prof/yas/Library/Application Support/Firefox/Profiles/019kso7s.default/.parentlock
$
% open /Applications/Calculator.app
これを、次のような方法を利用して、長い文字列をキーボードから打たないで
実行しなさい。
cosmos38:~ yas$ echo "$PS1"
\h:\W \u\$
cosmos38:~ yas$
この時、ダブルクォート ""
を付けないとうまく表示できないことがある。この理由を考えなさい。
シェル変数 PS1 は、シェルのプロンプトを保持している。これを変更してみな
さい。
cosmos38:~ yas$ PS1="hi$ "
hi$
マニュアル man bash で、PS1 変数(PROMPTING)の中で次のような表現がどのような意味を 持っているかを調べなさい。
\h
\W
\u
$ emacs
C-x C-f
ファイルを開く(存在しないファイル名をして新規作成する)
Find file: ~/file.txt
Auto-saving...done
$ ls *file.txt*
以下は、#file.txt#
というファイルが自動的に作られている。
$ ls -l *file.txt*
-rw-r--r-- 1 yas prof 4 4 29 20:44 #file.txt#
$
C-x C-s
でファイルを保存する。
$ ls *file.txt*
この結果、自動的に保存されたファイルは消え、保存したものだけが現れる。
$ ls -l *file.txt*
-rw-r--r-- 1 yas prof 4 4 29 20:50 file.txt
$
$ ls *file.txt*
この結果、2つのファイルが現れる。
C-x C-s
で保存したもの
$ ls -l *file.txt*
-rw-r--r-- 1 yas prof 11 4 29 20:52 #file.txt#
-rw-r--r-- 1 yas prof 4 4 29 20:50 file.txt
$
C-x C-f
でファイルを開く。
Find file: ~/file.txt
すると、次のようなメッセージが表示される。
file.txt has auto save data; consider M-x recover-this-file
一瞬の表示なので、見えない時には、一度C-x k
で、そのバッファを消
して、もう一度C-x C-f
でファイルを開く。
M-x recover-this-file
あるいは
Esc x recover-this-file
あるいは、C-x C-f
でファイルを開く変わり、
M-x recover-file![[←]](../icons/screen-return.gif)
と打ち、#
がついていないファイルを指定する。
Recover file: ~/file1.txt
recover-this-file
または recover-file
の結果、次のように2つの
ファイルが表示され、ミニバッファ(一番下の行)に yes/no が問い合わされる。
-rw-r--r-- 1 yas prof 4 4 29 20:50 /home/prof/yas/file.txt
-rw-r--r-- 1 yas prof 11 4 29 20:52 /home/prof/yas/#file.txt#
<中略>
-EEE:%%-F1 *Directory* All L1 (Help View)------------------------------------------
Recover auto save file /home/prof/yas/#file#? (yes or no)
以下の問題について、問題、および、回答をテキスト・ファイルに記述し、 レポート提出ページから提出しなさい。 端末の表示(コマンドの実行結果)は、コピー&ペースト等の機能を使って提出 するファイルに含めなさい。
(1) シェルのファイル名置換機能を使って /usr/bin にある次のようなファイ ルをすべて表示しなさい。結果は、ls または echo コマンドで表示し、コマン ドラインを含めてその結果をレポートに含めなさい。
(2) echo コマンドを使って、次の文字列を画面に表示しなさい。
(3) 次のファイル名(ディレクトリ名も含めたすべて)を、ファイル名置換を使っ て短く表現しなさい。
$ ls -ld 短い表現
drwxr-xr-x@ 3 mac-admin admin 102 1 16 09:29 /Applications/Firefox.app
$ ls -ld 短い表現
drwxr-xr-x@ 3 mac-admin admin 102 1 12 11:10 /Applications/Thunderbird.app
$ ls -ld 短い表現
drwxr-xr-x 3 root wheel 102 5 21 2009 /Applications/QuickTime Player.app
$
(4) 次のファイル名(ディレクトリ名も含めたすべて)を、適当なシェル変数を
設定して短く表現しなさい。
$ シェル変数の代入1
$ シェル変数の代入2
$ シェル変数の代入3
$ ls -ld シェル変数の参照を利用短い表現
drwxr-xr-x@ 3 mac-admin admin 102 1 16 09:29 /Applications/Firefox.app
$ ls -ld シェル変数の参照を利用短い表現
drwxr-xr-x@ 3 mac-admin admin 102 1 12 11:10 /Applications/Thunderbird.app
$ ls -ld シェル変数の参照を利用短い表現
drwxr-xr-x 3 root wheel 102 5 21 2009 /Applications/QuickTime Player.app
$
ヒント1: シェル変数への代入は、1回でもよい。
ヒント2: シェル変数の値に空白が含まれている(可能性がある)ものを参照する
時には、ダブルクォートでくくる("$name"
)とよい。
ヒント3: 補完機能と組み合わせてもよい。その場合にはどのようなキー操作を したのかをレポートに書きなさい。
(5) bash の補完機能を使って、次のファイル名を打ち込み、ls -ld で表示し なさい。この時、どのようなキー操作を行ったかをレポートに書きなさい。
$ ls -ld キー操作
$ ls -ld ~/Library/Application Support/Firefox/Profiles/
(6) The Unix Super Text の次の部分を読みなさい。
(6) [加点] /usr/bin にあるファイルのうち、ファイルファイルのサイズが大 きいもの5 個を表示するコマンドを示しなさい。
最終的に次のような結果が得られるはずである。
$ コマンド
-rwxr-xr-x 1 root wheel 29034848 2 11 19:32 php
-r-xr-xr-x 1 root wheel 26135456 9 10 2009 emacs
-rwxr-xr-x 1 root wheel 7802784 9 10 2009 emacs-undumped
-rwxr-xr-x 1 root wheel 7317488 2 11 16:07 net
-rwxr-xr-x 1 root wheel 6470896 2 11 16:07 rpcclient
$
(7) [加点] bash のヒアドキュメント(here document)の機能を使ってみなさい。
シェル変数が展開される方法とされない方法があることを示しなさい。