Ubuntuのshはdashへのシンボリックリンクでした

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.

コメント

タイトルとURLをコピーしました