Bashのさまざまな機能です。
行末に\を付けることで、コマンドを複数行にわたって記述出来ます。
パイプは、プログラムが出力した内容を別のプログラムに入力として再度渡す機能。上手く使うことで、たくさんの処理をひとつのテキストデータ(ストリーム)に対して複数行うことができる。また、リダイレクトはストリームとファイル入出力を変換する機能。読み込み、書き込み、追記が存在する。
言ってしまえば、オブジェクト指向の「.」と同じような考え方である。UNIXのコマンドは、多くがこのパイプによって使われることを意図して設計されている。
リダイレクトは、<は読み込み、>は書き込み、>>は追記です。
リダイレクトの例1:
$ echo hoge > hoge.txt $ echo hoge2 >> hoge.txt $ cat hoge.txt hoge hoge2
リダイレクトの例2:
$ patch -u < diff1.patch
その他にも、既にファイルが存在しても書く場合、エラー出力も取る場合などがあり、またCシェルとBシェルでも違う。以下のようなページを参照のこと。
普通のリダイレクトでは、標準出力しかリダイレクトされず、標準エラー出力は無視される。標準エラー出力もリダイレクトしたい場合は「&> hoge.txt」などとする。また、標準出力を1>、標準エラー出力を2>と分けて使うこともできる。(Windowsのコマンドプロンプトも同様に1>と2>で標準出力と標準エラー出力を区別できる。)
標準エラー出力を除外したい場合は、「2> /dev/null」のようにリダイレクトする。このようにした場合、標準エラー出力はどこにも表示されず、保存もされない。
パイプを使うことで、あるコマンドの結果を別のコマンドに渡すことができる。
$ find / | grep hoge
標準エラー出力も合わせてパイプに渡したい場合は、「|& less」などとする。
;を使うことで、複数のコマンドを同時に実行出来ます。また、&&や||を使うことで、コマンドが正常に終了した場合、異常に終了した場合に次のコマンドを実行出来ます。
たとえばこんな感じ:
# ./configure && make && make install
(Linuxコマンドを連続して使うには - Qiitaより引用。)
ファイル名展開(グロブ)は以下のようになる。
変数 | 説明 |
---|---|
* | 文字列にマッチ(0文字以上) |
? | 文字にマッチ(1文字) |
[...] | どれかの文字にマッチ |
たとえば、カレントディレクトリにある末尾に拡張子.txtの付くファイルだけ、ファイル名を一覧表示させるなら、
$ ls *.txt
とする。
(bash 入門 - RAT Portal Siteを参考に執筆しました。)
2024.07.28編集
ブレース展開はmkdirなどに与えることで、まとめてパスを切ることができる。
$ mkdir -p data/{schwarz,zaidou}/{2019,2020,2021}
(bash 入門 - RAT Portal Siteを参考に執筆しました。)
チルダ(~)はホームディレクトリを指す。
cd ~
「cd ~」とすることでホームディレクトリに移動できるほか、ホームディレクトリ内のディレクトリやファイルを「vi ~/.emacs」などと表すことができる。
変数を使うことで、シェルスクリプトなどが綺麗に書けることがある。
変数名=値
のように代入し、展開する時は
$変数名
または
${変数名}
のように使う。
文字列の値を変数に代入したい時は"~"などで囲む。そのため、
$ HOGE="Hoge is an art." $ echo $HOGE Hoge is an art.
などとなる。
2024.07.28編集
コマンド名をそのコマンドを実行した出力で置き換えられる。
$(コマンド)
または
`コマンド`
のように使う。
後日注記:コマンド置換はパイプと同様の技術で、コマンドの出力結果を使って別のコマンドを実行できる。応用するとさまざまなことができる。find, grep, sed, awkのようなコマンドと組み合わせて、dpkgやbashなどに送ることで、ワンライナーで簡単に自動処理ができる。
変数展開とコマンド置換を使うことで、たとえば、
DATA_DIR=/home/assy/data BACKUP_DIR=/home/assy/data_backup FILENAME=$(date +%Y.%m.%d).tar.gz cd $BACKUP_DIR tar czpf $FILENAME $DATA_DIR
のように、dateコマンドの結果をtarで作成するアーカイブのファイル名に指定できる。
UNIXシステム管理(cron)も参照のこと。
2024.07.28
シェル変数の一覧を見るためには、setコマンドを使う。
$ set (シェル変数の一覧が表示される)
シェル変数の設定は以下のように行う。
$ HOGE=hoge
(bash 入門 - RAT Portal Siteを参考に執筆しました。)
環境変数の一覧を見るためには、envコマンドを使う。
$ env (環境変数の一覧が表示される)
あるいは、printenvコマンドを使うことでも環境変数の一覧を参照できる。
$ printenv (環境変数の一覧が表示される)
環境変数は、シェル変数をexportすることで設定できる。
$ HOGE=hoge $ export HOGE
環境変数を削除するにはunsetコマンドを使う。
$ unset HOGE
シェル変数はプロセスには引き継がれないが、環境変数はプロセスの中から参照できる。
(bash 入門 - RAT Portal SiteとLinux入門 ~「パスを通す」とは~ #Linux - Qiitaを参考に執筆しました。)
2024.07.28編集
環境変数の例として、コマンドの実行ファイルのある場所を指すPATHや、ホームディレクトリを指すHOME、Bashで表示されるプロンプトを変更できるPS1などがある。
2024.07.28
sourceコマンドは、ファイルの内容を起動中のシェルで実行する。初期化スクリプトなどの設定を反映させることができる。
source .bashrc
(【 source 】コマンド/【 . 】コマンド――シェルの設定を即座に反映させる:Linux基本コマンドTips(169) - @ITを参考に執筆しました。)
コマンドをフォアグラウンドで実行する時は、単にコマンドを実行します。
コマンドの最後に&を付けると、バックグランドで並列的にコマンドを実行出来ます。
$ cp /home/hoge/test1 /home/hoge/test2 &
&をつけたバックグラウンド実行はとても良く使うので覚えておきましょう。特に、GUIアプリケーションをコマンドラインから実行したりする時に良く使います。サーバーデーモンも&と同じ仕組みで動いています。
基本的に、コマンドをマルチタスクで実行したい時は、なんでもコマンド行の最後に&をつければ並列で実行される。特にXのターミナルからGUIアプリケーションを実行する時、&をつけずに実行すると、ターミナルエミュレータのウィンドウを閉じた時にGUIアプリケーションも一緒に終了してしまう。必ず「firefox &」のように最後に&をつけて並列で実行させるようにしよう。
コマンド | 説明 |
---|---|
Ctrl+z | 一時停止。 プロセスを一時停止する(サスペンド)。 |
Ctrl+c | 強制終了。 フォアグランドで実行中のプロセスを強制終了する。 |
jobs | ジョブの一覧。 サスペンド中・バックグラウンドで実行中のジョブの一覧を表示する。 |
bg | バックグラウンドへジョブの実行を切り替え。 サスペンド中のジョブをバックグラウンドで実行する。 |
fg | フォアグラウンドへジョブの実行を切り替え。 サスペンド中・バックグラウンドで実行中のジョブをフォアグラウンドで実行する。 |
ps | プロセス一覧。 実行中のプロセス一覧を表示する。 |
kill | 強制終了。 バックグラウンドで実行中のプロセスを強制終了する。 |
(初心者のためのシェル(bash)入門 - 2ch-Linux-Beginnersを参考に執筆しました。)
~/はホームディレクトリのことを表す。
ファイル名 | 説明 |
---|---|
~/.bash_profile | ログインシェルにログインした時に実行される。 |
~/.bashrc | シェルを起動する度に実行される。 |
~/.bash_logout | シェルをログアウトした時に実行される。 |
ホームディレクトリにある.bachrcをカスタマイズすることで、さまざまなユーザー環境の設定を変更できる。
Bashの設定(ひいてはユーザーごとのシステムの設定)は.bachrcで行う。環境変数PATHなども.bachrcで恒久的な設定を行う。
詳しくは以下のページを参照のこと。
2024.07.28編集
Readlineは、Bashで使われているコマンドライン入力用のライブラリ。さまざまなショートカットがあり、履歴の管理やコマンドラインの補完などもReadlineによって行われている。
NetBSDのeditlineというライブラリもある。
詳しくは以下が参考になります。
また、以下のページはPlamo Linux作者のこじまみつひろ氏によってBashの機能が紹介されており、参考になります。