Ubuntuのshはbashへのリンクではなく、dashへのリンクで若干ハマったのでメモしておきます。
CentOSなどのRedHat系ディストリビューションに慣れていたため、ついつい勘違いしてハマってしまった経験を共有します。
UbuntuとAlmaLinuxでshの詳細情報を確認
UbuntuとAlmalinuxではshのシンボリックリンク先が下記のように異なっていました。
- Ubuntu: /usr/bin/dash
- AlmaLinux: /usr/bin/bash
Ubuntu 22.04でshを確認
今回確認を行ったUbuntuのバージョンです。
$ cat /etc/issue Ubuntu 22.04.4 LTS \n \l
whichコマンドでshのフルパスを確認します。
$ which sh /usr/bin/sh
ls -lコマンドで/usr/bin/shの詳細を確認すると、dashへのシンボリックリンクであると表示されました。
$ ls -l /usr/bin/sh lrwxrwxrwx 1 root root 4 Mar 23 2022 /usr/bin/sh -> dash
AlimaLinux9.3(RedHat系)でshを確認
確認を行ったAlmaLinuxのバージョンです
$ cat /etc/almalinux-release AlmaLinux release 9.3 (Shamrock Pampas Cat)
whichコマンドでshのフルパスを確認します。
$ which sh /usr/bin/sh
ls -lコマンドで/usr/bin/shの詳細を確認すると、bashへのシンボリックリンクであると表示されました。
$ ls -l /usr/bin/sh lrwxrwxrwx. 1 root root 4 Jan 24 2023 /usr/bin/sh -> bash
Ubuntuのshがdashへのシンボリックリンクであることに気づいた経緯
下記のような「text.txt」ファイルが存在するかどうかを判別するシェルスクリプトをbashで作成しました。
$ cat filecheck.sh #!/bin/bash FILE=text.txt if [[ -f ${FILE} ]]; then echo "${FILE} found." else echo "${FILE} not found." fi
実行権限を付けてからスクリプト実行すると問題なく動作しています。
$ chmod +x filecheck.sh $ ./filecheck.sh text.txt not found.
sh -xで動作の内容を詳しく確認しようとしたところ、「[[: not found」というエラーが発生しました。
$ sh -x ./filecheck.sh + FILE=text.txt + [[ -f text.txt ]] ./filecheck.sh: 5: [[: not found + echo text.txt not found. text.txt not found.
さっきはちゃんと動いてたのに「???」という気分です。
色々と調べてみると、[[ ]]での条件判断式はbashじゃないと使えないことがわかったので、Ubuntuのshを確認してみるとdashへのシンボリックリンクだということが判明したのでした。
いままではbash特有の機能を使っていなかったのでsh -x でもエラーが発生せず、bashを使っている勘違いしていたのですね。
sh -xを使わずにスクリプトの動作を確認する方法
shを使わずbashで実行
スクリプトを実行する際にbashを使うと正常に動作します。
$ bash -x ./filecheck.sh + FILE=text.txt + [[ -f text.txt ]] + echo 'text.txt not found.' text.txt not found.
set -xを指定する
スクリプトにset -xを追加して、スクリプトを直接実行するという方法もあります。
#!/bin/bash set -x FILE=text.txt if [[ -f ${FILE} ]]; then echo "${FILE} found." else echo "${FILE} not found." fi
set -xでスクリプトの実行状況を詳しく表示させることができます。
$ ./filecheck.sh + FILE=text.txt + [[ -f text.txt ]] + echo 'text.txt not found.' text.txt not found.
コメント