2013年06月11日 情報科学類 コンピュータリテラシ 筑波大学 システム情報系 情報工学域 新城 靖 <yas@cs.tsukuba.ac.jp>
このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~yas/coins/literacy-2013/2013-06-11
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~yas/
http://www.cs.tsukuba.ac.jp/~yas/
コンピュータを操作する時の態度:
コンピュータと人間
ホーム・ディレクトリ、 Desktop や Documents(書類)に、多くのファイルを放置することはよくない。 ディレクトリを作成し、整理すべきである。 1つの目安は、ls コマンドで 1画面に入らない時には分割する。
$ mkdir dirname
この結果、dirname
という名前のディレクトリが作らる。
$ mv oldname newname
この結果、ファイルoldfileのファイル名をnewnameに変更される。
ここで、newname のファイルが存在した場合、元の newname は消されてしまう。
mvコマンドは、ディレクトリの名前を変更するために使える。
$ mkdir dir1
$ ls
dir1
$ mv dir1 dir2
$ ls
dir2
$
$ mkdir ~/dir1
$ mv oldname ~/dir1/newname
この結果、カレント・ワーキング・ディレクトリにある
ファイルoldfileのファイル名は、
~/dir1/newnameに変更される。
次のように、ディレクトリだけを指定することもできる。
$ mv name ~/dir1/
この場合、次のものと同じになる。
$ mv name ~/dir1/name
また、変更先にディレクトリを指定する mv では、ファイル名は1個でなくて
も複数でもよい。
$ mv file1 file2 file3 ~/dir1
シェルの
ファイル名置換
を使うと便利。
$ ls file[1-3]
(ファイル名の確認)
$ mv file[1-3] ~/dir1
$ ls file?
(ファイル名の確認)
$ mv file? ~/dir1
$ ls file*
(ファイル名の確認)
$ mv file* ~/dir1
ファイルを消すには、rm (remove) コマンドを用いる。
$ rm file1
このファイル file1 が削除される。
rm コマンドで消してしまったファイルは、一般的には2度と戻らない。 消す前に、本当に不要かどうかを確認すること。
コマンド名の置換え(alias)等て、rm を rm -i に変えることは、一般的には勧
められない。「rm -i y」という操作が、一連の操作として身に付い
てしまうので。
$ rmdir dirname
この結果、
ディレクトリdirnameが削除される。
空でないディレクトリは、rmdir()コマンドでは 「Directory not empty」 というエラー・メッセージが表示され削除できない。 この場合は、子供のディレクトリやファイル を削除してからもう一度削除する。
coins のファイルサーバには、過去のある瞬間の整合性がある状態(スナップ ショット)を自動的に保存する機能がある。過去2週間程度のファイルの状態が わかる。
$ ls /home/.snapshot/
hourly.0 nightly.0 nightly.4
hourly.1 nightly.1 nightly.5
hourly.2 nightly.10 nightly.6
hourly.3 nightly.11 nightly.7
hourly.4 nightly.12 nightly.8
hourly.5 nightly.13 nightly.9
hourly.6 nightly.2
lilac-fss(0151728424)_vol1.296 nightly.3
$
nightly*
hourly*
$ cat /home/.snapshot/nightly.9/prof/yas/.bashrc
cp でコピーしたり、emacs で読むこともできる。
例:
何もしないと、自動的に再帰的な処理を行うプログラムもある。例: tar, tree, find 等。
ディレクトリに対しても mv コマンドは有効である。ディレクトリの名前を mv で変更すると、木構造で考えると、それ以下のファイルの名前を全て変更し たことと同じ効果がある。
ファイルのコピーでは、以下で述べるシンボリック・リンク等の問題があるため、 cp -r では不十分なことが多い。
大量の情報を保存するには、木構造を使うしかない。 しかし、木構造だけではうまくいかない。
図13 こうもりの分類(1)
図14 こうもりの分類(2)
木構造は、ファイルを整理するのに非常に強力な構造である。しかし、それだ けでは、ファイルを整理するには不都合が起きる。それを解消するために、次 のような名前で呼ばれる仕組みが用意されている。
注意:bash, csh の alias とファイル名の alias (Macintosh) は、まったくの別物。
図15 こうもりの分類(別名つき)
木構造を補う方法として、 ハイパーテキスト を使うことがある。
例:java コマンド
$ ls -l /usr/bin/java
lrwxr-xr-x 1 root wheel 74 5 29 14:46 /usr/bin/java -> /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/java
$
シンボリック・リンクは、ls -l で見ると、右端に l (小文字の L) と表示さ
れる。
ファイル /usr/bin/java
を参照すると、
/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/
にある
java
が使われる。
シンボリック・リンクを作成するには、ln -s コマンドを使う。
$ ln -s oldname newname
この結果、newname
でファイルを参照すると、
oldname
というファイルが使われる。(このファイルは、
newname
と oldname
の2つの名前を持つ。)
$ cat file1-slink.text
file1
$ ln -s file1.text file1-slink.text
$ ls -l file1.text file1-slink.text
lrwxrwxrwx 1 yas prof 10 6 13 12:13 file1-slink.text -> file1.text
-rw-r--r-- 1 yas prof 6 6 13 12:13 file1.text
$ cp file1-slink.text file2.text
$ cat file2.text
file1
$
MacOSX の Finder は、次のような役割を持つ。
デスクトップは、MacOSX では、ホーム・ディレクトリの下の
「~/Desktop
」という名前のディレクトリに対応している。
注意事項
シンボリック・リンクとエイリアスの違い
変数名=値
」を使う。
$ 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
$
設定されていないシェル変数を使おうとすると、空として扱われる。
注意:シェルのプロンプト($
) と間違えないこと。シェルのプロンプ
ト($
) は、実際のコンピュータでは、cosmos38:~ i1012345$
のようになっている。
$ X=100
...
$ export X
$
あるいは、最初から export を付けて代入の操作をすることもできる。
$ export X=100
$
bash では、環境変数の参照方法と削除方法はシェル変数と同じ($
とunset)である。
$ date
2013年 6月 7日 金曜日 15時03分41秒 JST
$ echo $TZ
$ TZ=EST
$ export TZ
$ echo $TZ
EST
$ date
2013年 6月 7日 金曜日 01時04分22秒 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
$
$ ls -ld "/Applications/QuickTime Player.app"
drwxr-xr-x 3 root wheel 102 3 28 09:11 /Applications/QuickTime Player.app
$ open "/Applications/QuickTime Player.app"
$
バックスラッシュを使ってもよい。
$ ls -ld /Applications/QuickTime\ Player.app
drwxr-xr-x 3 root wheel 102 3 28 09:11 /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![[tab]](../icons/screen-tab.gif)
$ ls -ld /Applications/Q![[tab]](../icons/screen-tab.gif)
$ ls -ld /Applications/QuickTime\
$ ls -ld /Applications/QuickTime\ P![[tab]](../icons/screen-tab.gif)
$ ls -ld /Applications/QuickTime\ Player.app/
ファイル名の補完機能を使う時には、空白を打ち込むには、
「\
バックスラッシュ スペース」と打つ必要がある。
補完よりも、ファイル名の置き換え機能が簡単のこともある。
$ ls -ld /A*/Q*P*
drwxr-xr-x 3 root wheel 102 3 28 09:11 /Applications/QuickTime Player.app
$
$ echo $PATH
/home/prof/yas/bin:/usr/local3/coins/macosx/bin:/usr/local3/coins/common/bin:/De
veloper/Simulator/GTKwave/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/
local3/bin:/opt/local/bin:/usr/X11/bin
$ printenv PATH
/home/prof/yas/bin:/usr/local3/coins/macosx/bin:/usr/local3/coins/common/bin:/De
veloper/Simulator/GTKwave/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/
local3/bin:/opt/local/bin:/usr/X11/bin
$
シェルは、打ち込まれたコマンドを環境変数 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
$
$ cd ~
$ ls -R . | lv
$ ls -lR . | lv
$ ls -laR . | lv
-R
オプションは、このようにしばしば-l
オプションや
-a
オプションと一緒に使われる。また、-R
オプションは、大
量の結果を表示することが多いので、パイプに出力してページャで表示するこ
とが多い。
(これらのオプションを忘れた人は、man コマンドを見なさい。)
tree コマンドに -N オプションをつけると、ファイル名に漢字を含むものも表 示できる。
$ tree -N ディレクトリ名
さらに、nkf を使えば、ファイル名を EUC で表示できる。
$ tree -N ディレクトリ名 | nkf -e
詳しくは、man tree を見なさい。
$ mkdir ~/dir1
$ ls ~/dir1
(最初は空)
$ cd ~/dir1
$ ls
(最初は空)
$ emacs file1.txt
$ ls
file1.txt
$ ls
(削除するファイルの確認)
$ rm file1.txt
(削除。成功すると何も表示されない。)
$ rm file1.txt~
(もし、「~」付きのファイルがあれば、削除。成功すると何も表示されない。)
$ ls
(ディレクトリが空であることの確認)
$ cd ..
(1個上のディレクトリに移動。)
$ ls ~/dir1
(ディレクトリが空であることの確認)
$ ls -d ~/dir1
(ディレクトリが存在すること確認)
$ rmdir ~/dir1
(ディレクトリの削除。成功すると何も表示されない。)
$ ls -d ~/dir1
(エラーが表示されることにより、ディレクトリが削除されたことを確認)
$
ls コマンドは、「.」から始まるファイル名を表示しない。ls コマンドに -a オプションを付けると、表示する。
ディレクトリを削除しようとした時に、ls コマンドで表示されないが、「.」 で始まるファイルがあるために、削除できないことがある。このことを確認し なさい。
$ mkdir ~/from_dir
$ mkdir ~/to_dir
$ cd ~/from_dir
$ echo 1 > file1.txt
$ echo 2 > file2.txt
$ echo 3 > file3.txt
$ ls *.txt
$ ls *.txt
(移動するファイルの確認)
$ ls ~/to_dir
(移動する先のディレクトリの確認)
$ mv *.txt ~/to_dir
(移動。成功すると何も表示されない。)
$ ls ~/to_dir
(移動した先のディレクトリの確認)
$ open ~/from_dir
$ open ~/to_dir
option キーを押しながらドラッグすると、移動ではなく、コピーになる。 このことを確認しなさい。
なお、コピーを行った後、元のファイルを消せば実質的に移動(改名)になる。
$ mkdir ~/dir1
$ cd ~/from_dir
$ echo 1 > file1.txt
$ ls
(ファイル名の確認)
$ mv file1.txt file2.txt
(改名。成功すると何も表示されない。)
$ ls
(ファイル名の確認)
名称未設定フォルダ
」という名前のフォルダが作成される。
$ ls -l /Applications | grep '^l'
ここで、'^l'
は、行の先頭がl
で始
まるという意味である。
The Unix Super Text 第32章 正規表現 参照。
端末の文字コードが EUC のものと、UTF-8 のもので、次のコマンドの実行結果 を比較しなさい。
$ locale
$ echo $LANG
漢字の名前をディレクトリを含むディレクトリで、次のコマンドの結果を比較 しなさい。
$ cd 漢字のディレクトリを含むディレクトリ
$ ls
$ ls -v
$ ls | cat
$ ls | nkf -e
$ ls | nkf -w
端末の中で Emacs を実行し、M-x set-keyboard-coding-system と M-x
set-terminal-coding-system やで、端末の入出力の文字コードて適合させなさ
い。
$ lynx .
$ lynx ~
$ w3m .
$ w3m ~
C-u M-x help ![[←]](../icons/screen-return.gif)
t
English ![[←]](../icons/screen-return.gif)
$ 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/
の下にあるファイル名
を設定して、その動作を確認しなさい。
$ echo $HOME
cd コマンドの引数に与えて、ホーム・ディレクトリや
ホーム・ディレクトリ以下のディレクトリに移動してみなさい。
$ cd /
$ cd $HOME
$ cd /
$ cd $HOME/Desktop
$
ファイル名の置き換え機能「~/」を使う方法と環境変数 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 を実行するなどしてシェルを実行する。
$ echo $HISTFILESIZE
history コマンドで表示されるコマンドの数を調べなさい。
$ history
<表示>
$ history | wc
$
wc は、word count の略で、行数、単語数、バイト数を表示する。一番左が行
数である。
シェル変数 HISTFILESIZE の値を変化させると、何が起きるか調べなさい。
cosmos38:~ yas$ echo "$PS1"
\h:\W \u\$
cosmos38:~ yas$
この時、ダブルクォート ""
を付けないとうまく表示できないことがある。この理由を考えなさい。
シェル変数 PS1 は、シェルのプロンプトを保持している。これを変更してみな
さい。
cosmos38:~ yas$ PS1="hi$ "
hi$
マニュアル man bash で、PS1 変数(PROMPTING)の中で次のような表現がどのような意味を 持っているかを調べなさい。
\h
\W
\u
$ set
どのようなシェル変数が設定されているか観察しなさい。
$ 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
$
" "
」 や シングルクォート
「' '
」の働きを調べなさい。
$ echo "$HOME"
(表示の確認)
$ echo '$HOME'
(表示の確認)
ダブルクォート「" "
」 や シングルクォート 「'
'
」は、中に改行を含めることができる。逆に言うと、必ず閉じる
必要がある。閉じられていない場合には、シェルのプロンプトが$
から
>
に変化する。このことを確認しなさい。
$ echo "a
> b
> c"
(表示の確認)
$ echo 'a
> b
> c'
(表示の確認)
$
$ history
$ history | tail -5
(過去の5行だけ表示)
$ history | grep cd
(cd を含む行だけ表示)
$ history | lv
(ページャ lv でページ単位で表示。)
!
の後に番号
!!
^P
/^N
で選択して 以下の問題について、問題、および、回答をテキスト・ファイルに記述し、 レポート提出ページから提出しなさい。端末の表示 (コマンドの実行結果)は、コピー&ペースト等の機能を使って提出するファイ ルに含めなさい。課題が達成されたことを示す程度には見やすいように編集し なさい。ただし、過度の編集は避けなさい。編集した部分は必要に応じて省略 記号を入れなさい。
テキスト・ファイルで、右揃えをするには、パラグラフの区切りを、空行にし た上で、M-q (Esc q, M-x fill-paragraph) の機 能を利用するとよい。
(1) mkdir, rm, ln -s 等のコマンドや Finder を用いて、ファイルを整理しなさい。 レポートには次の項目を含めなさい。
ディレクトリ構成の説明には、tree コマンドの結果を利用してもよい。ただし、
今回整理した部分だけを含めること。~/Library/ など、自分では整理しなかっ
たファイルについては、含めないこと。
「tree -N
」 でファイル名に漢字を含むものも表示できる。
「tree -N | nkf -e
」で、さらにファイル名が EUC に変換される。
課題が出される前に既にディレクトリを作成して既に既に整った状況であった 場合には、問題点の代わりに整理の考え方について説明しなさい。またディレ クトリを新たに作成する代わりに既存のディレクトリについて報告してもよい。
(2) 次のファイル名(ディレクトリ名も含めたすべて)を、適当なシェル変数を 設定して短く表現しなさい。
/Applications/Firefox.app /Applications/Thunderbird.app /Applications/QuickTime Player.app短く表現したものを、ls -ld コマンドの引数に与えて実行しなさい。
$ シェル変数の代入1
$ シェル変数の代入2
$ シェル変数の代入3
...
$ シェル変数の代入n
$ 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: 補完機能と組み合わせてもよい。その場合にはどのようなキー操作を したのかをレポートに書きなさい。
(3) echo コマンドを使って、次の文字列を画面に表示しなさい。
$ echo 回答内容
Lib*
$
注意:これは、メタキャラクタをエスケープする課題である。単に echo コマ
ンドに対してこのような文字列を与えればよいということでない。
(4) [加点] 以下のコマンドは、環境変数によって動作が変わる。どのような環 境変数でどのように動作が変わるかを man コマンドや The Unix Super Text (30.4.2 節、その他各コマンドの説明) で調べなさい。そして 練習問題(1625) と同様に実際に実行し、動作の 変化を確かめなさい。 全体として、コマンドと環境変数の組で、3 個以上の例を示しなさい。ただし、 環境変数としては PATH, TZ 以外のものを使いなさい。同じ環境変数で、複数 のコマンドの動作が変化するものを含めてもよい。
(5) [加点] Emacs で、英語でチュートリアルを実施しなさい。開始日時と終了 日時を報告しなさい。