Linuxでは、シェルスクリプトを活用することで処理の自動化などが行える。システム管理のさまざまな場面でシェルスクリプトが使われており、管理機能がシェルスクリプトで作られていることもある。以下、It’s FOSSの「How to Run a Shell Script in Linux [Essentials Explained]」記事を参考に、Linuxのビギナーユーザー向けにLinuxでシェルスクリプトを実行する方法を紹介しよう。
1. シェルの引数にシェルスクリプトを指定して実行する
It's FOSSの記事ではまず、シェルスクリプトファイルをシェルの引数に指定して実行する方法を紹介している。紹介に使われているシェルスクリプトは次のとおり。「Hello World!」という文字列を標準出力に出力するというシェルスクリプトだ。
hello.sh
echo "Hello World!"
例えば、このシェルスクリプトをbashで実行すると次のようになる。
bashでシェルスクリプトを実行する方法
bash hello.sh
シェルとしてzshを使う場合のサンプルは以下のようになる。
zshでシェルスクリプトを実行する方法
zsh hello.sh
bashはLinuxでデフォルトのシェルとして使われていることが多い。MacではmacOS Catalina以降でデフォルトシェルとしてzshが使われている。
この方法ではシェルスクリプトを実行するシェルを明示的に指定できるほか、シェルスクリプトファイルそのものには実行権限が必要ないという特徴がある。
2. パスを指定してシェルスクリプトを実行する
It's FOSSの記事では次のステップとして、ファイルパスを指定してシェルスクリプトを実行する方法を紹介している。使っているシェルスクリプトは先程と同じだ。
hello.sh
echo "Hello World!"
パスを指定してシェルスクリプトを実行する場合、シェルスクリプトファイルに実行権限が必要になる。実行権限は次のようにchmodコマンドを使って設定する。
chmodコマンドでシェルスクリプトファイルに実行権限を与えるサンプル
chmod u+x hello.sh
実行権限を設定した後は、パスを指定することでシェルスクリプトを実行することができる。
パスを指定してシェルスクリプトを実行
./hello.sh
上記の方法では、その時に使用しているシェルを用いてシェルスクリプトが実行される。It's FOSSでは次のステップとして、実行に使用するシェルを指定する方法を説明している。まず、説明に使うシェルスクリプトとして、次のシェルスクリプトを用意している。
array.sh
files=("f1.txt" "f2.txt" "f3.txt" "f4.txt" "f5.txt")
echo "Element at index 1 is"
echo ${files[1]}
上記のシェルスクリプトarray.shを1.の方法でbashおよびzshで実行すると、次のようになる。
bashでは配列インデックスは0から始まり、zshでは配列インデックスは1から始まる。このため、同じシェルスクリプトarray.shを実行しても、bashとzshで実行結果が異なる。It's FOSSではこうしたシェルによる挙動の違いを引き合いに出し、シェルスクリプトで明示的に実行に使うシェルを指定することの必要性を説明している。
シェルスクリプトでは、次のようにファイルの先頭に#!からはじまる文字列でシェルをフルパスで指定することで、実行するシェルを指定可能だ。
bashでシェルスクリプトを実行する場合の書き方
#!/bin/bash
files=("f1.txt" "f2.txt" "f3.txt" "f4.txt" "f5.txt")
echo "Element at index 1 is"
echo ${files[1]}
zshでシェルスクリプトを実行する場合の書き方
#!/bin/zsh
files=("f1.txt" "f2.txt" "f3.txt" "f4.txt" "f5.txt")
echo "Element at index 1 is"
echo ${files[1]}
上記サンプルは、bashとzshがそれぞれ/bin/bashおよび/bin/zshとしてインストールされている場合の例となる。別の場所にインストールされている場合はパスを書き換える必要がある。
パスを指定しないでシェルスクリプトを実行する
It's FOSSの記事では、パスを指定しないでシェルスクリプトを実行する方法も簡単に説明している。環境変数PATHに指定されているディレクトリに実行可能な状態のシェルスクリプトを置いておけば、パスから指定しなくてもシェルスクリプト名だけでシェルスクリプトを実行できるようになる。
例えば、上記スクリーンショットで表示されている環境変数PATHでは、コロン区切りで次のディレクトリが指定されている。
- /usr/local/sbin
- /usr/local/bin
- /usr/sbin
- /usr/bin
- /sbin
- /bin
- /usr/games
- /usr/local/games
- /mnt/c/Program Files/WindowsApps/Microsoft.WindowsTerminal_1.5.10411.0_x64__8wekyb3d8bbwe
- /mnt/c/WINDOWS/system32
- /mnt/c/WINDOWS
- /mnt/c/WINDOWS/System32/Wbem
- /mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/
- /mnt/c/WINDOWS/System32/OpenSSH/
- /mnt/c/Users/daichi/AppData/Local/Microsoft/WindowsApps
- /mnt/c/Users/daichi/AppData/Local/Programs/Microsoft VS Code/bin
- /snap/bin
- /home/daichi/.cache/vim/dein/repos/github.com/junegunn/fzf/bin
つまり、上記の環境では、シェルスクリプトを上記ディレクトリのどれかに実行権限を持った状態で置いておけば、シェルスクリプトファイル名だけでシェルスクリプトが実行できるようになる。