コラム

bashについての基礎的な知識

概要

bashはCLIと呼ばれるキーボード操作のみでPCを操作するための一つの言語(シェルスクリプト)です。

シェルスクリプトには他にもtcsh、zshなどがあります。最近のmacだとデフォルトでzshになっています。

bashをデフォルトにしたい場合には簡単に設定できますので、調べてみてください。

bashが生まれた背景

シェルスクリプトはカーネルというOSの基本機能を担うソフトウェアに情報を伝達する役割を持つと供に、カーネルを直接操作できないように隠す意味合いも持ちます。

$ touch file.txt <- ファイル作成
$ cat file.txt <- ファイルの中身表示

また、上記のような簡単なコマンドでデータにアクセスしたりファイルを書き込んだりするなどの重要なことが実行できるようになります。

1970代初頭にプログラマーがパンチカードを使用していた頃には画期的なコンセプトでした。

シェルのコンセプトは何年にもわたって進化してきました。

初期時はBourne shell(bshコマンド)が最も人気があり、89年に後継としてbashが登場しました。

一世代前のMac OSやほとんどのLinuxディストリビューションなどのunixマシンでターミナルを開くと、デフォルトのシェルは通常bashです。

コマンドラインに手動で入力した全てのコードは、シェルを起動するコードで自動化できます。

具体的には、.bashrcもしくは.bash_profileに記述することで可能です。(zshの場合には異なります)

# シェルスクリプトの調べ方
$ which $SHELL
> /usr/bin/bash

例えば、どんな時に使用するかというとanacondaをインストールした際に、何かしらの不具合もしくは設定ミスでcondaを読み込まないケースがあります。

そこで、意図的にシェル起動時にcondaを呼ぶ処理を記述すれば、いつでもターミナルからcondaを呼ぶことができます。これにより、新しいセッションを開始するたびシェルの動作と外観をカスタマイズ可能です。

.bash_profile(例)

# >>> conda initialize >>>
# !! Contents within this block are managed by 'conda init' !!
__conda_setup="$('/opt/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)"
if [ $? -eq 0 ]; then
    eval "$__conda_setup"
else
    if [ -f "/opt/anaconda3/etc/profile.d/conda.sh" ]; then
        . "/opt/anaconda3/etc/profile.d/conda.sh"
    else
        export PATH="/opt/anaconda3/bin:$PATH"
    fi
fi
unset __conda_setup
# <<< conda initialize <<<

他にもシェルスクリプトの活用方法として、<ファイル名>.shのファイルを作成し、プロジェクト毎に独自のbashスクリプトを追加できます。一つ試してみます。

test.sh

#!/usr/bin/bash
echo "while文にリダイレクション"

# readコマンドで標準入力から1行読み込む
while read line
do
  echo "$line"
done <$1

echo "カレントシェルにリダイレクション"

# exec コマンドを使用しカレントシェルの標準入力へリダイレクトする
exec <$1

# readコマンドで標準入力から1行読み込む
while read line
do
  echo "$line"
done

test.txt

111111
222222
333333
444444
555555
666666

$ bash test.sh test.txt

を実行すると、

while文にリダイレクション
111111
222222
333333
444444
555555
666666
カレントシェルにリダイレクション

が表示されます。これは本当に単純ですが、bashのメソッドを使うことで複雑なこともできるようになります。

.bashrcと.bash_profileの違い

.bashrcは対話モードのbashが起動する度に実行されます。

対して、.bash_profileはログイン時のみ実行されるという違いがあります。

具体的には、.bashrcには「bashでしか使わないもの」を記述する
ex) エイリアス、シェルオプション、プロンプト設定

.bash_profileにはログイン時にセッション全体に適用するものを記述
ex) 環境変数

一番重要なのが、.bashrcで何も出力してはならないということだけには注意しましょう。