シェルスクリプトの基本
シェルスクリプトとは
コマンドラインをあらかじめ記述しておくファイルのこと
再利用できる、他の人に再配布できる、コマンド打ち間違いがなくなる、などの利点がある
code:シェルスクリプトの例
# 簡単なシェルスクリプトを記述
du -h ~ | tail -n 1
# 実行権限をつける
-rw-rw-r--. 1 vagrant vagrant 32 Mar 8 11:52 homesize.sh
-rwxrwxr-x. 1 vagrant vagrant 32 Mar 8 11:52 homesize.sh
# ファイルの実行
104K /home/vagrant
du -h ~ | tail -n 1
シバン(#!/bin/bash)について
ファイルを読み込んだときにまず実行される行
シェルスクリプトが/bin/bash で実行されるという宣言を行っている
#はコメント行として無視されるので、シェルからはこの1行は無視される
シバンがない場合は、source ./homesize.sh として動かすことも可能
この時は、カレントディレクトリでファイルの中身を流し込んで実行している、というイメージなのでファイルそのものに実行権限が不要になる
sourceコマンドと同じ意味で. が使える . ./homesize.sh
実行方法による動作の違い
sourceコマンドではカレントディレクトリで処理が行われるが、ファイル名で実行した場合にはサブシェルでシェルスクリプトが実行されるという違いがある
code:実行方法による違い
# エイリアスを登録する
total 36
drwx------. 4 vagrant vagrant 142 Feb 29 07:43 ./
drwxr-xr-x. 3 root root 21 Jun 1 2019 ../
-rw-------. 1 vagrant vagrant 10516 Mar 8 12:04 .bash_history
-rw-r--r--. 1 vagrant vagrant 18 Oct 30 2018 .bash_logout
-rw-r--r--. 1 vagrant vagrant 193 Oct 30 2018 .bash_profile
-rw-r--r--. 1 vagrant vagrant 497 Feb 23 08:52 .bashrc
-rw-r--r--. 1 vagrant vagrant 231 Feb 23 06:00 .bashrc.org
-rw-------. 1 vagrant vagrant 50 Feb 12 11:04 .lesshst
drwx------. 2 vagrant vagrant 29 Feb 7 11:55 .ssh/
drwxrwxr-x. 5 vagrant vagrant 4096 Mar 8 11:52 work/
# エイリアスを使ったシェルスクリプトを用意する
lsalf /
# sourceで実行すると、エイリアスの設定が反映されるので実行できる
total 2097168
dr-xr-xr-x. 18 root root 255 Feb 7 11:55 ./
dr-xr-xr-x. 18 root root 255 Feb 7 11:55 ../
lrwxrwxrwx. 1 root root 7 Jun 1 2019 bin -> usr/bin/
dr-xr-xr-x. 4 root root 4096 Jun 1 2019 boot/
drwxr-xr-x. 17 root root 2860 Mar 8 13:59 dev/
drwxr-xr-x. 78 root root 8192 Mar 8 13:59 etc/
drwxr-xr-x. 3 root root 21 Jun 1 2019 home/
lrwxrwxrwx. 1 root root 7 Jun 1 2019 lib -> usr/lib/
lrwxrwxrwx. 1 root root 9 Jun 1 2019 lib64 -> usr/lib64/
drwxr-xr-x. 2 root root 6 Apr 11 2018 media/
drwxr-xr-x. 2 root root 6 Apr 11 2018 mnt/
drwxr-xr-x. 2 root root 6 Apr 11 2018 opt/
dr-xr-xr-x. 90 root root 0 Mar 8 13:59 proc/
dr-xr-x---. 2 root root 158 Feb 23 07:19 root/
drwxr-xr-x. 24 root root 740 Mar 8 13:59 run/
lrwxrwxrwx. 1 root root 8 Jun 1 2019 sbin -> usr/sbin/
drwxr-xr-x. 2 root root 6 Apr 11 2018 srv/
-rw-------. 1 root root 2147483648 Jun 1 2019 swapfile
dr-xr-xr-x. 13 root root 0 Mar 8 13:59 sys/
drwxrwxrwt. 8 root root 172 Mar 8 14:05 tmp/
drwxr-xr-x. 13 root root 155 Jun 1 2019 usr/
drwxr-xr-x. 2 vagrant vagrant 25 Feb 7 11:54 vagrant/
drwxr-xr-x. 18 root root 254 Feb 7 11:55 var/
# ファイル名で実行してみると、コマンドがないというエラー(=設定したエイリアスが反映されてない)
./test1.sh: line 2: lsalf: command not found
ファイルを実行した場合は、コマンド実行前にサブシェル(子プロセス)が立ち上がって、そこでコマンドが実行されるので元のシェルで設定されたエイリアスは反映されない
逆にいうと、sourceコマンドで実行するスクリプトはカレントシェルに影響を及ぼすということでもあるので注意が必要
例えば、sourceで実行したシェルスクリプト内にエイリアスの設定などがあると、実行後も元のシェルで有効になるなど
ではどっちを使うのか??→主にシバンを利用してファイルを実行することが多い
ユーザーの実行環境(シェル)に左右されない
sourceによって現在のシェルの設定を引き継ぐことにより、想定外の動作をすることがある
コマンドの実行終了後もシェルに元の影響を与えてしまう
sourceコマンドの使い方→ ~/.bashrc の読み込みなど
シェルスクリプトを配置する
自分のシェルスクリプト置き場を作る
~/binというディレクトリを用意してそこに配置する→~/.bash_profileに記述を追加してパスを通しておく
PATH=$PATH:~/bin →$PATHに~/binを追加した
配置したらsource ~/.bash_profile で設定を反映させる