105.1 レッスン 1
Certificate: |
LPIC-1 |
---|---|
Version: |
5.0 |
Topic: |
105 シェルとシェルスクリプト |
Objective: |
105.1 シェル環境をカスタマイズして使用する |
Lesson: |
1 of 3 |
はじめに
シェルは間違いなくLinuxシステムで最も強力なツールであり、ユーザーとカーネルとの間のインターフェースとして、ユーザーが入力したコマンドを解釈します。つまり、すべてのシステム管理者は、シェルの使い方に習熟していなければななりません。ご存じのように、大部分のLinuxディストリビューションでは、Bourne Again Shell(Bash)がシェルとして使われています。
Bash(やその他のシェル)が起動するとまず、一連の起動スクリプトを実行します。起動スクリプトは、セッションの環境をカスタマイズします。システム全体のスクリプトと、ユーザー毎に固有のスクリプトがあります。これらのスクリプトでは、変数、エイリアス、関数などを用いて、ユーザーのニーズや好みに応じた設定を行えます。
シェルの種類によって、読み込まれる起動ファイルが異なります。いくつかのパターンを見てみましょう。
シェルの種類: 対話型 vs 非対話型 と ログイン vs 非ログイン
まず始めに、シェルおける 対話型 と ログインシェル の概念を明確にします。
- 対話型シェルと非対話型シェル
-
ユーザーとシェルの間で、対話が行われるか否かを意味します: 対話型シェルでは、シェルがプロンプトを表示し、ユーザーがキーボードからコマンドを入力し、シェルは画面にメッセージを出力します。
- ログインシェルと非ログインシェル
-
ユーザーがアカウント名やパスワードを入力してコンピューターシステムにログインした直後に実行されるシェルを、ログインシェル と呼びます。それ以外のシェルは、非ログインシェル です。
ログインシェルと非ログインシェルのいずれにも、対話型と非対話型があり、その組み合わせによって役割が異なります。
ユーザーがシステムにログインしたときに実行される 対話型のログインシェル は、ユーザーの必要に応じて設定(環境)をカスタマイズします。例えば、ある部署に属するユーザーが利用するアプリケーション用に、特別な変数を定義するといった処理を行います。
対話型の非ログインシェル は、ログイン後にユーザーが実行するシェルです。一時的に別のユーザーになったり、ログインシェルとは異なるシェルを利用するために明示的にサブ(子)シェルを起動することがあります。このタイプのシェルでは、ログインシェルと同様に、ファイルのコピーやスクリプトの作成といった作業を行うことができますし、独自の変数を定義することもできます。
非対話型のシェル は、ユーザーとのやりとりを行いません。自動実行されるシェルスクリプトが、このタイプのシェルを使用します。つまりこのタイプのシェルは、プロンプトを表示して入力を求めることはありませんし、出力が必要な場合はファイルに書き込みます。
非対話型のログインシェル はほとんど使われません。このタイプのシェルを使うことはまずありませんが、シェルの挙動を説明するために触れておきます。例えば、/bin/bash --login <スクリプト>
を実行すると、ログインシェルと同じ処理を行ってからスクリプトを実行しますし、あるいは、sshコマンドの標準入力(stdin)にスクリプトをパイプすれば、そのスクリプトが(リモートマシンの)ログインシェルで実行されます。
cat script.sh | ssh <ユーザー名>@<サーバー名>
前述のように、自動化されたスクリプト(主に定期的に繰り返し実行する保守管理タスクを実行するために、cronから起動される)では、非対話型の非ログインシェル が使われます。このタイプのシェルでは、ログイン時に読み込まれる起動ファイルの一部が読み取られません。
ターミナルを開く
デスクトップ環境では、ターミナル(エミュレーター)アプリケーションを開くか、システムコンソールの1つに切り替えることで、シェルにアクセスします。GUIからアクセスした場合には、端末装置(tty
)ではなく、端末エミュレータ(pty
(仮想端末))を扱うことになります。GUIセッションで使用する gnome-terminal や konsole などの端末エミュレーターは、テキストベースの端末装置よりも機能が豊富でユーザーフレンドリーですが、XTerm や sakura といったシンプルなターミナルエミュレーターも存在します。
キーボードから Ctrl+Alt+F1 から Ctrl+Alt+F6 を使用することで、テキストベースで対話型のログインシェルを開くコンソールログインに移動できます。Ctrl+Alt+F7 で、デスクトップセッションに戻ります。(訳注:PCアーキテクチャの場合のみですし、ファンクションキーの割り当てはディストリビューションによって異なります)。
Note
|
|
bash
でシェルを起動する
ログイン後、ターミナルに bash
と入力して新しいシェルを開きます。技術的には、このシェルはログインシェルの子プロセスになります。
子プロセスとして bash
を起動するときに、さまざまなオプションで起動するシェルのタイプを指定できます。bash
起動時のいくつかのオプションを示します。
bash -l
またはbash --login
-
ログインシェルを起動します。
bash -i
-
対話型シェルを起動します。
bash --noprofile
-
ログインシェルを起動する際に読み込まれるシステム全体の起動ファイル
/etc/profile
と、ユーザーレベルの起動ファイル~/.bash_profile
,~/.bash_login
,~/.profile
をすべて無視します。 bash --norc
-
対話型シェルを起動する際に読み込まれるシステム全体の起動ファイル
/etc/bash.bashrc
ファイルと、ユーザーレベルの起動ファイル~/.bashrc
の両方を無視します。 bash --rcfile <file>
-
対話型シェルを起動する際に、システム全体の起動ファイル
/etc/bash.bashrc
やユーザーレベルの起動ファイル~/.bashrc
を無視して、代わりに<file>
を起動ファイルとして実行します。
次に、さまざまな起動ファイルについて説明します。
su
と sudo
によるシェルの起動
これら2つの似通ったコマンドを使用することで、任意のタイプのシェルを実行できます。
su
-
ユーザーIDを変更するか、スーパーユーザー(
root
)になります。このコマンドでは、ログインシェルと非ログインシェルのどちらも呼び出すことができます。-
su - user2
、su -l user2
、su --login user2
はいずれも、user2
として対話型のログインシェルを起動します。 -
su user2
は、user2
として対話型の非ログインシェルを起動します。 -
su - root
またはsu -
は、root
として対話型のログインシェルを起動します。 -
su root
またはsu
は、root
として対話型の非ログインシェルを起動します。
-
なお、su
コマンドを実行すると、変更後のユーザー(例では user2
ないし root
)のパスワードが尋ねられます。
sudo
-
別のユーザー(スーパーユーザーを含む)としてコマンドを実行します。sudoコマンドは主に、一時的にroot権限を持ってコマンドを実行するために使用し、このコマンドを使用するユーザーは
sudoers
ファイルに記載されている必要があります。ディストリビューションによって異なりますが、Debian系ディストリビューションではグループsudo
が、Redhat系ディストリビューションではグループwheel
が、デフォルトでsudoers
ファイルに記載されています。sudoコマンドを実行するユーザーを、それらのグループに追加すればsudoコマンドを使用できるようになります。user2
をsudo
グループに所属させるには、次のようにします。(訳注: インストール時に作成した「最初のユーザー」は、sudoコマンドを実行できるグループに所属しているのが一般的です。)root@debian:~# usermod -aG sudo user2
su
と同様にsudo
でも、ログインシェルと非ログインシェルのどちらかを呼び出すことができます。-
sudo su - user2
、sudo su -l user2
、sudo su --login user2
はいずれも、user2
として対話的なログインシェルを起動します。※注 -
sudo su user2
は、user2
として対話的なな非ログインシェルを起動します。※注 -
sudo -u user2 -s
は、user2
として対話的な非ログインシェルを起動します。 -
sudo su - root
、sudo su -
は、root
として対話的なログインシェルを起動します。※注 -
sudo -i
は、root
として対話的なログインシェルを起動します。 -
sudo -i <some_command>
は、root
として対話的なログインシェルを起動してコマンドを実行し、終了すると今のシェルに戻ります。 -
sudo su root
、sudo su
は、root
として対話的な非ログインシェルを起動します。※注 -
sudo -s
、sudo -u root -s
は、root
として対話的な非ログインシェルを起動します。
-
su
や sudo
を使用する場合、どのタイプのシェルを起動するのかを考慮します。切替先ユーザーの作業環境に切り替える必要があるときは、ログインシェルを呼び出します。オプションを指定しなければ、非ログインシェルを呼び出します。
※訳注: su
は Switch User に由来し、切替先のユーザーのシェルを起動するコマンドで、特定のコマンドを実行する際は -c
オプションを指定します。対して sudo
は Switch User DO に由来し、指定したコマンドだけを実行するコマンドで、切替先のユーザーとしてシェルを実行するには -i
ないし -s
オプションを指定します。また、su
コマンドを実行すると変更後のユーザー(例では user2 ないし root)のパスワードが尋ねられますが、sudo
コマンドでは自分(現在のユーザー)のパスワードが尋ねられます。su
コマンドの利用はパスワードの共有に繋がるため、セキュリティの面から推奨されていません。
実行中のシェルはどのタイプ?
作業中のシェルのタイプを確認するためには、echo $0
コマンドを実行します。
- 対話型のログインシェル
-
-bash
- 対話型の非ログインシェル
-
bash
または/bin/bash
- 非対話型の非ログインシェル(スクリプト)
-
<スクリプト名>
いくつのシェルがあるか?
システムで稼働中の bash
シェルの数を確認するには、コマンド ps aux | grep bash
を使用します。
user2@debian:~$ ps aux | grep bash user2 5270 0.1 0.1 25532 5664 pts/0 Ss 23:03 0:00 bash user2 5411 0.3 0.1 25608 5268 tty1 S+ 23:03 0:00 -bash user2 5452 0.0 0.0 16760 940 pts/0 S+ 23:04 0:00 grep --color=auto bash
ps
コマンドの TTY
と COMMAND
欄などから、実行中のシェルのタイプが分かります。
1行目では TTY
が pts
(仮想端末)であることから、user2
はGUIセッションにログインしてターミナルを開いたものと推測されます(GUIのターミナル内で実行されるシェルは、対話型の非ログインシェルになります)。
2行目では TTY
が tty1
であることから、user2
はCtrl+Alt+F1を入力して、1番目の仮想コンソールからシェルセッションに入ったのでしょう(コンソールからのログインでは、対話型のログインシェルが起動します)。
3行目の出力は、grep
コマンドの引数に bash
が含まれているために表示されたものです。TTY
欄が1行目の bash
と同じ pts/0
ですから、user2
はCtrl+Alt+F7を入力してGUIセッションに戻り、ターミナルでコマンド ps aux | grep bash
を実行したものと推測されます。GUI環境のターミナルエミュレーターでは、ログインシェルではなく非ログインシェルが起動されることに注意してください。ただし、GUI環境が起動するときにログイン時に必要な起動ファイルを読み込んでいますから、シェル環境としては同じです。
シェル環境を整える 起動ファイル
Linuxシステムにおけるシェルの種類を理解したので、それぞれのタイプのシェルが実行する起動ファイル(スタートアップファイル)を見ていきましょう。システム全体で有効となるスクリプトは /etc/
ディレクトリに置かれて、ユーザー毎に固有のスクリプトはユーザーのホーム(~
)ディレクトリに置かれます。ユーザー固有の起動ファイルは、所定の順序で検索して見つかった最初のもののみが読み込まれて、残りのファイルには進みません。お気に入りのテキストエディタか、less
を使って、以下に示す起動ファイルを自分で調べてください。
Note
|
起動ファイルには、Bashのみが読み込むものと、大部分のシェルが利用する一般的なものがあります。 |
対話型ログインシェルの場合
グローバル(システム全体)レベル
/etc/profile
-
Bourneシェル(
sh
)とその互換シェル(bash
など)が利用する、システム全体の(すべてのユーザーが対象の)起動ファイルです。このファイルでは、if
文で要件を確認しながら、PATH
やPS1
などいくつかの変数を設定します。ディストリビューションによって異なりますが、/etc/profile
スクリプトは、追加の起動ファイル(/etc/bashrc
や/etc/profile.d
内のファイル)があれば、それらを追加で読み込んで実行するものが多いようです。 /etc/profile.d/*
-
このディレクトリが存在するディストリビューションでは、
/etc/profile
がこのディレクトリにある起動ファイルを追加で読み込みます。
ユーザーレベル
シェルはグローバルレベルの起動ファイルを処理した後に、ユーザーレベルの起動ファイルを1つだけ読み込みます。ログインシェルでは、以下の順にファイルを探して最初に見つかったもののみを実行します。
~/.bash_profile
-
Bashがログインシェルであれば、まず最初にこの
~/.bash_profile
を探しますが、他の(bash互換ではない)シェルは、このファイルを無視します。つまり、この起動ファイルでは、bashに固有の命令を使うことができます。ディストリビューションによって処理内容は異なりますが、~/.profile
を追加で読み込むものが多いようです。 ~/.bash_login
-
Bashがログインシェルである場合、
~/bash_profile
が存在しないときに、次にこのファイルを探します。有れば実行しますし、無い場合には次のファイルに進みます。 ~/.profile
-
このファイルはBashに固有ではありません(つまり他のシェルでも実行されます)。このファイルでは、すべてのシェルで必要となる
PATH
などの重要な環境変数を設定します(例えば、~/bin
ディレクトリがあれば、それをPATH
に追加します)。ログインシェルがBashの場合は、後述の~/.bashrc
ファイルを追加で読み込むことが多いようです。 ~/.bash_logout
-
このファイルは
起動ファイル
ではなく、ログインシェルが終了するときに実行される、いわば終了ファイル
です。リモートセッションのクリーンアップや、コンソール画面を消去するなどの処理を行うために利用されます。
対話型ログインシェルの起動ファイルを探索する
/etc/profile
と /home/user2/.profile
を変更して、これらのファイルがどのように実行されるかを見てみましょう。それぞれのファイルに、実行中のファイル名を表示するコマンドを追加します。
root@debian:~# echo 'echo Hello from /etc/profile' >> /etc/profile root@debian:~# echo 'echo Hello from ~/.profile' >> ~/.profile
Note
|
リダイレクト演算子 |
echo
で追加したコマンドの出力で、これらのファイルがいつ読み取られて実行されるかがわかります。確認するために、別のマシンから ssh
を使って user2
としてログインしてみます。
user2@debian:~$ ssh user2@192.168.1.6 user2@192.168.1.6's password: Linux debian 4.9.0-8-amd64 #1 SMP Debian 4.9.130-2 (2018-10-27) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Tue Nov 27 19:57:19 2018 from 192.168.1.10 Hello from /etc/profile Hello from /home/user2/.profile
追加したechoコマンドによって、最後の2行が表示されました。次の3点に注意してください。
-
グローバルレベルのファイル(/etc/profile)が最初に実行された。
-
次にユーザーレベルのファイル(
~/.profile
)が実行された(~/.bash_profile
ないし~/.bash_login
から、明示的に読み込まれた可能性もあります)。 -
チルダ(
~
)がファイルの絶対パス(/home/user2/.profile
)に展開されている。
対話型非ログインシェルの場合
グローバル(システム全体)レベル
/etc/bash.bashrc
-
bash
用のグローバルレベルの起動ファイルです。このスクリプトでは、bash
が対話的に実行されていることを確認し、画面サイズ(ウィンドウサイズ)を環境変数(LINES
とCOLUMNS
)にセットしたり、シェルプロンプトの書式をセットするといった処理を行います。
ユーザーレベル
~/.bashrc
-
bash
用のユーザーレベルの起動ファイルです。/etc/bash.bashrc
と同様のタスク(対話的な実行や画面サイズの確認)に加えて、ヒストリーに係わる環境変数をセットしたり、~/.bash_aliases
ファイルを読み込んでエイリアスや関数を定義します。
対話型非ログインシェルの起動ファイルを探索する
今度は、/etc/bash.bashrc
と /home/user2/.bashrc
を変更してみます。
root@debian:~# echo 'echo Hello from /etc/bash.bashrc' >> /etc/bash.bashrc root@debian:~# echo 'echo Hello from ~/.bashrc' >> ~/.bashrc
user2
が新しいシェルを起動したときはこうなります。
user2@debian:~$ bash Hello from /etc/bash.bashrc Hello from /home/user2/.bashrc
ここでも、2つのファイルが読み取られて実行されました。
Warning
|
グローバルファイルが先に実行されるので、ユーザーレベルのファイル内容が優先されます。 |
非対話型ログインシェルの場合
bash
の起動時に、-l
または --login
オプションを指定すると、ログインシェルとして動作します。すなわち、対話型のログインシェルの場合と同じ起動ファイルが読み取られます。
確認するために、簡単なスクリプトを書いて実行してみます。コマンドラインから ログインオプション を指定した /bin/bash
を直接呼び出すので、スクリプトファイルに shebangs(#!
)は含めません。
-
test.sh
というスクリプトを作成して、実行されたことが確認できるようにecho 'Hello from a script'
という行を入れておきます。user2@debian:~$ echo "echo 'Hello from a script'" > test.sh
-
スクリプトを実行可能にします。
user2@debian:~$ chmod +x ./test.sh
-
-l
オプションを指定したbash
を呼び出して、test.sh
を実行します。user2@debian:~$ bash -l ./test.sh Hello from /etc/profile Hello from /home/user2/.profile Hello from a script
結果はこうなります! スクリプトを実行する前に、ログイン時と同様に
/etc/profile
と~/.profile
の両方が実行されました。
Note
|
シェルスクリプトと shebangs については、後のレッスンで説明します。 |
次に、echo
コマンドの標準出力(stdout)を、パイプで ssh
の標準入力(stdin)に繋いでみましょう。
user2@debian:~$ echo "Hello-from-a-noninteractive-login-shell" | ssh user2@192.168.1.6 Pseudo-terminal will not be allocated because stdin is not a terminal. user2@192.168.1.6's password: Linux debian 4.9.0-8-amd64 #1 SMP Debian 4.9.130-2 (2018-10-27) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Hello from /etc/profile Hello from /home/user2/.profile -bash: line 1: Hello-from-a-noninteractive-login-shell: command not found
今度も /etc/profile
と ~/.profile
が実行されました。出力の最初の行(stdinがターミナルではないので仮想端末は割り当てられない)と、と最後の行(リモートマシンの -bash
からのエラーメッセージ)から、非対話型のログインシェルが動いていることが分かります。
非対話型の非ログインシェルの場合
非対話型の非ログインシェルでは、ここまでに述べた起動ファイルのいずれも読み取りません。その代わりに、環境変数 BASH_ENV
を探して、その値をファイル名とするファイルを起動ファイルとして使用します。環境変数 については、次のレッスンで詳しく学習します。
まとめると、ログインした直後には通常、/etc/profile
と ~/.profile
が実行されて、それらが /etc/bash.bashrc
と ~/.bashrc
を実行します。次のコマンドの出力は、その様子を示しています。
root@debian:~# su - user2 Hello from /etc/bash.bashrc Hello from /etc/profile Hello from /home/user2/.bashrc Hello from /home/user2/.profile
su - user2
は、対話型のログインシェルを呼び出します。それぞれの起動スクリプトの最後にメッセージを出力する行を追加したことに注意してください。4行の出力は次のように説明できます。
-
Hello from /etc/bash.bashrc
は、/etc/profile
が/etc/bash.bashrc
を読み取って実行したことを示します。 -
Hello from /etc/profile
は、/etc/profile
が最後まで実行されたことを示します。 -
Hello from /home/user2/.bashrc
は、~/.profile
が~/.bashrc
を読み取って実行したことを示します。 -
Hello from /home/user2/.profile
は、~/.profile
が最後まで実行されたことを示します。
su - <username>
(su -l <username>
と su --login <username>
も同じ意味です)でログインシェルを呼び出したときには、これらの起動ファイルが実行されることを見てきました。対して su <username>
では、 /etc/bash.bashrc
と ~/.bashrc
が実行されます。(訳注: 実行される起動スクリプトが違うことが、最も重要な「ログインシェル」と「非ログインシェル」の違いです。)
ファイルの読み込み(sourcing)
ここまでの説明で、一部の起動スクリプトから、他のスクリプトが読み込まれて実行されることがあることを説明しました。このセクションでは、このソーシングと呼ばれる仕組みを説明します。
.
でファイルを読み込む
多くの起動ファイルには、他のファイルを読み込むドット(.
)コマンドが含まれています。
例えば、Debianの .profile
を見てみましょう。
# include .bashrc if it exists if [ -f "$HOME/.bashrc" ]; then . "$HOME/.bashrc" fi
この if
ブロックは、$HOME/.bashrc
が存在する場合(-f
)に、それを読み込んで実行することを意味しています。以下のステートメントが、ファイルを読み込んでいる部分です:
. "$HOME/.bashrc"
Note
|
|
また、起動ファイルを変更した時に、再起動や再ログインせずにその変更を有効にしたい場合にも、.
を使用します。例を示しましょう:
-
~/.bashrc
にエイリアスを追加します。user2@debian:~$ echo "alias hi='echo We salute you.'" >> ~/.bashrc
Warning
|
1つのコマンドを起動ファイルに追加する時には、上書き( |
-
~/.bashrc
の末尾を表示して、コマンドが追加されたことを確認します。user2@debian:~$ tail -n 1 !$ tail -n 1 ~/.bashrc alias hi='echo We salute you.'
Note!$
は直前のコマンドの最後の引数に展開されます(ヒストリー機能の利用例です)。この場合は~/.bashrc
です。 -
手動でファイルをソースします。
user2@debian:~$ . ~/.bashrc
-
エイリアスを呼び出してみて、動作を確認します。
user2@debian:~$ hi We salute you.
Note
|
エイリアス と 変数 については、次のレッスンで説明します。 |
source
でファイルを読み込む
source
コマンドは .
コマンドの同義語です。~/.bashrc
を読み込むには、次のようにすることもできます。
user2@debian:~$ source ~/.bashrc
起動ファイルの起源: SKEL
skel
ディレクトリ(skeletalに由来)は、新しいユーザーアカウントを作成したときに、そのホームディレクトリに置かれるファイル構造のテンプレートです。その中には、新しいユーザーアカウントを作成した際に、そのホームディレクトリに置かれるシェルの起動ファイルなどが含まれています。システムにおける skel
ディレクトリの絶対パスは、adduser
コマンドの設定ファイルである /etc/adduser.conf
の中にある SKEL
変数に定義されています。
user2@debian:~$ grep SKEL /etc/adduser.conf # The SKEL variable specifies the directory containing "skeletal" user SKEL=/etc/skel # If SKEL_IGNORE_REGEX is set, adduser will ignore files matching this SKEL_IGNORE_REGEX="dpkg-(old|new|dist|save)"
SKEL
は /etc/skel
に設定されているのが一般的です。つまり、ほとんどの場合、シェルを設定する起動スクリプトは /etc/skel
にあります。
user2@debian:~$ ls -a /etc/skel/ . .. .bash_logout .bashrc .profile
Warning
|
名前が |
新規ユーザーのホームディレクトリに、個人用のスクリプトを保存するディレクトリ my_personal_scripts
が置かれるように、/etc/skel
にディレクトリを作成してみましょう。
-
まず
root
として/etc/skel
に移動します。root@debian:~# cd /etc/skel/ root@debian:/etc/skel#
-
内容を確認します。
root@debian:/etc/skel# ls -a . .. .bash_logout .bashrc .profile
-
ディレクトリを作成して確認します。
root@debian:/etc/skel# mkdir my_personal_scripts root@debian:/etc/skel# ls -a . .. .bash_logout .bashrc my_personal_scripts .profile
-
次に
user2
をそのhome
ディレクトリと共にいったん削除します。root@debian:~# deluser --remove-home user2 Looking for files to backup/remove ... Removing files ... Removing user `user2' ... Warning: group `user2' has no more members. Done.
-
再度
user2
を追加して、新しいホームディレクトリを作ります。root@debian:~# adduser user2 Adding user `user2' ... Adding new group `user2' (1001) ... Adding new user `user2' (1001) with group `user2' ... Creating home directory `/home/user2' ... Copying files from `/etc/skel' ... Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully Changing the user information for user2 Enter the new value, or press ENTER for the default Full Name []: Room Number []: Work Phone []: Home Phone []: Other []: Is the information correct? [Y/n] y
-
最後に
user2
としてログインして、/home/user2
にあるすべてのファイルをリストして、期待通りになっていることを確認します:root@debian:~# su - user2 user2@debian:~$ pwd /home/user2 user2@debian:~$ ls -a . .. .bash_history .bash_logout .bashrc my_personal_scripts .profile
my_personal_scripts
ディレクトリがコピーされています。
演習
-
“シェルの起動方法” 列で指定した方法で起動したシェルのタイプを調べて、表を完成させてください。
シェルの起動方法 対話型? ログインシェル? echo $0
の結果ssh user2@machine2
Ctrl+Alt+F2
su - user2
gnome-terminal
konsole から sakura(端末エミュレータの一種)を起動
echo $0
を含むtest.sh
というスクリプト -
指定されたシェルを起動するには、どのような
su
およびsudo
コマンドを実行しますか?user2
として、対話型のログインシェル-
su
:sudo
: root
として、対話型のログインシェル-
su
:sudo
: root
として、対話型の非ログインシェル-
su
:sudo
: user2
として、対話型の非ログインシェル-
su
:sudo
:
-
“タイプ” 列のシェルを起動した時に読み込まれる起動ファイルはどれですか? 読み込まれるものをマークして表を完成させてください。
タイプ /etc/profile
/etc/bash.bashrc
~/.profile
~/.bashrc
user2
の対話型ログインシェルroot
の対話型ログインシェルroot
の対話型・非ログインシェルuser2
の対話型・非ログインシェル
発展演習
-
以下のコードは、
Hello world!
と表示するBash用の関数を定義します。このコードを含むファイルを作成してください。function hello() { echo "Hello world!" }
-
現在のシェルでこの関数を使用できるようにするにはどうしますか?
-
使用できるようになったら、関数をどうやって呼び出しますか?
-
user2
がXウィンドウセッションでターミナルを開いたときに、この関数を自動的に定義してそれを呼び出せるようにするには、コードをどの起動ファイルに置きますか? また、その時のシェルのタイプは何ですか? -
ログインシェルであるかどうかに関係なく、
root
が新しい対話型シェルを起動したときに、関数を定義して実行するには、どのファイルにコードを置きますか?
-
-
以下の単純な
Hello_world!
スクリプトがあります:#!/bin/bash #hello_world: a simple bash script to discuss interaction in scripts. echo "Hello world!"
-
スクリプトを実行可能にして実行します。スクリプトを実行するシェルは対話型でしょうか? またそれはどうしてですか?
-
どのようなときに非対話的なシェルが起動されますか?
-
-
~/.bashrc
のいくつかの変数の値を変更してそれらを有効にしたいのですが、再起動や再ログインはしたくありません。その方法を2つ示して下さい。ホームディレクトリに居るとします。 -
Johnは、LinuxサーバーでX Windowセッションを開始しました。ターミナルエミュレータでいくつかの管理タスクを実行しているときに、X Windowセッションがフリーズしてしまったので、テキストシェルを開く必要があります。
-
tty
シェルを開くにはどうしますか? -
その時に読み込まれる起動ファイルは何ですか?
-
-
LindaはあるLinuxサーバのユーザです。彼女は、ログインしたときに日付と時刻を表示するように、システム管理者に依頼しました。システム管理者は、
.bash_login
ファイルを作成して、彼女の要望に応えました。多くのユーザーが同じ対応を求めたので、システム管理者は、すべての新しいユーザに~/.bash_login
を提供することにしました。どうすればよいですか?
まとめ
このレッスンでは、次のことを学びました。
-
シェルは、Linuxシステムにおける ユーザーの環境 を設定します。
-
Bash は、GNU/Linuxディストリビューションにおいて最もよく使われているシェルです。
-
シェルが最初に実行するジョブは、いくつかの起動ファイルを読み取って実行することです。
-
対話型 シェルと ログインシェル の概念。
-
bash
、su
、sudo
コマンドで、さまざまなタイプのシェルを起動する方法。Ctrl+Alt+F1 〜 F6を使用して、tty
コンソールからログインする方法。 -
echo $0
でシェルのタイプを確認する方法。 -
個人用の起動ファイル:
~/.bash_profile
、~/.profile
、~/.bash_login
、~/.bashrc
、~/.bash_logout
。 -
システム全体の(グローバルな)起動ファイル:
/etc/profile
、/etc/profile.d/*
、/etc/bash.bashrc
。 -
ユーザーレベルの起動ファイルは、グローバルレベルの起動ファイルよりも優先されること。
-
>
(上書き)と>>
(追加)を使用して、コマンドの出力をリダイレクトする方法。 -
skel
ディレクトリの役割。 -
ファイルを読み込む方法(sourcing)。
このレッスンでは、以下のコマンドを説明しました。
bash
-
新しいシェルを起動します。
su
-
別のユーザーに切り替えて、新しいシェルを起動します。
sudo
-
別のユーザーに切り替えて、コマンドを実行します。
usermod
-
ユーザーアカウントの属性を変更します。
echo
-
テキストを表示します。
ps
-
現在のプロセスの状態をレポートします。
less
-
ページングしながらファイルを表示します。
ssh
-
(リモートマシンに対して)SSH接続を開始します。
chmod
-
ファイルのモードビットを変更します。たとえば、ファイルを実行可能にするなど。
grep
-
パターンに一致する行を出力する。
ls
-
ディレクトリの内容を一覧表示します。
cd
-
作業ディレクトリを変更します。
mkdir
-
ディレクトリを作成します。
deluser
-
ユーザーを削除します。
adduser
-
新しいユーザーを追加します。
.
-
ファイルを読み込みます。
source
-
ファイルを読み込みます。
tail
-
ファイルの末尾部分を表示します。
演習の解答
-
“シェルの起動方法” 列で指定した方法で起動したシェルのタイプを調べて、表を完成させてください。
シェルの起動方法 対話型? ログインシェル? echo $0
の結果ssh user2@machine2
Yes
Yes
-bash
Ctrl+Alt+F2
Yes
Yes
-bash
su - user2
Yes
Yes
-su
gnome-terminal
Yes
No
bash
konsole から sakura (端末エミュレータの一種)を起動
Yes
No
/bin/bash
echo $0
を含むtest.sh
というスクリプトNo
No
./test.sh
-
指定されたシェルを起動するには、どのような
su
およびsudo
コマンドを実行しますか?user2
として、対話型のログインシェルsu
-
su - user2
またはsu -l user2
,su --login user2
sudo
-
sudo su - user2
またはsudo su -l user2
、sudo su --login user2
root
として、対話型のログインシェルsu
-
su - root
またはsu -
sudo
-
sudo su - root
またはsudo su -
、sudo -i
root
として、対話型の非ログインシェルsu
-
su root
またはsu
sudo
-
sudo su root
またはsudo su
、sudo -s
、sudo -u root -s
user2
として、対話型の非ログインシェルsu
-
su user2
sudo
-
sudo su user2
またはsudo -u user2 -s
-
“タイプ” 列のシェルを起動した時に読み込まれる起動ファイルはどれですか? 読み込まれるものをマークして表を完成させてください。
タイプ /etc/profile
/etc/bash.bashrc
~/.profile
~/.bashrc
user2
の対話型ログインシェルYes
Yes
Yes
Yes
root
の対話型ログインシェルYes
Yes
Yes
Yes
root
の対話型・非ログインシェルNo
Yes
No
Yes
user2
の対話型・非ログインシェルNo
Yes
No
Yes
発展演習の解答
-
Bashでは、ファイルに次のコードを含めることで、単純な
Hello world!
関数を記述できます。function hello() { echo "Hello world!" }
-
現在のシェルでこの関数を使用できるようにするにはどうしますか?
現在のシェルで関数を有効とするには、関数を含むファイルを読み込みます(ソーシング)。
-
使用できるようになったら、関数をどうやって呼び出しますか?
ターミナルに関数名を入力します。
-
user2
がXウィンドウセッションでターミナルを開いたときに、この関数を自動的に定義してそれを呼び出せるようにするには、コードをどの起動ファイルに置きますか? また、その時のシェルのタイプは何ですか?/home/user2/.bashrc
ファイルが最適です。起動されたシェルは、対話型の非ログインシェルになります。 -
ログインシェルであるかどうかに関係なく、
root
が新しい対話型シェルを起動したときに、関数を定義して実行するには、どのファイルにコードを置きますか?/root/.bashrc
ファイルが最適です。このファイルは、ログインシェルであるかどうかに関係なく、すべての対話型シェルで実行されるからです。
-
-
以下の単純な
Hello_world!
スクリプトがあります:#!/bin/bash #hello_world: a simple bash script to discuss interaction in scripts. echo "Hello world!"
-
スクリプトを実行可能にして実行します。スクリプトを実行するシェルは対話型でしょうか? またそれはどうしてですか?
いいえ、対話型ではありません。スクリプトを実行するシェルは、プロンプトを表示してユーザーにコマンドを求めることがありませんから、非対話型になります。
-
どのようなときに非対話型のシェルが起動されますか?
シェルスクリプトを実行するシェル(インタープリタとしてのシェル)は、一般的に非対話型になります。厳密な定義は、bashのmanページの「起動(INVOCATION)」セクションを参照してください。
-
-
~/.bashrc
のいくつかの変数の値を変更してそれらを有効にしたいのですが、再起動や再ログインはしたくありません。その方法を2つ示して下さい。ホームディレクトリに居るとします。$ source .bashrc
または、
$ . .bashrc
-
Johnは、LinuxサーバーでX Windowセッションを開始しました。ターミナルエミュレータでいくつかの管理タスクを実行しているときに、X Windowセッションがフリーズしてしまったので、テキストシェルを開く必要があります。
-
tty
シェルを開くにはどうしますか?Ctrl+Alt+F1〜Ctrl+Alt+F6を押して、6つのttyシェルの1つに入ります。(訳注: 仮想コンソールを使用できるのは、x86-64などの PCアーキテクチャ のマシンだけです。また、ディストリビューションによってファンクションキーの割り当てが異なります。)
-
読み込まれる起動ファイルは何ですか?
/etc/profile
/home/john/.profile
-
-
LindaはあるLinuxサーバのユーザです。彼女は、ログインしたときに日付と時刻を表示するように、システム管理者に依頼しました。システム管理者は、
.bash_login
ファイルを作成して、彼女の要望に応えました。多くのユーザーが同じ対応を求めたので、システム管理者は、すべての新しいユーザに~/.bash_login
を提供することにしました。どうすればよいですか?/etc/skel
ディレクトリに、.bash_login
を置きます。