※当サイトの記事には、広告・プロモーションが含まれます。

/bin/shで実行と/bin/bashで実行とで、実現できることが異なる罠

scienceportal.jst.go.jp

 次世代の量子コンピューターと、従来型のスーパーコンピューターを連携させ、高度な計算をより幅広い領域で行うための研究開発を始める、と理化学研究所が発表した。2つのタイプの商用量子コンピューターを新たに導入し、世界屈指の実力を持つスパコン「富岳」などを活用。企業や大学と共に、これらを連携させるシステムソフトウェアの開発を目指す。

量子コンピューターとスパコン連携、研究開発に着手 理研など | Science Portal - 科学技術の最新情報サイト「サイエンスポータル」

プログラミング言語としては、何を利用するんだろうか?Rustとか使うのかな?

/bin/shと/bin/bash

bashで動くコーディングしてたら、sh実行で利用できない機能があって、かなり泥沼にハマったので整理してみることに。

とりあえず、Wikipediaさんによりますと、

In computing, a shebang (pronounced "shi-BANG") is the character sequence consisting of the characters number sign and exclamation mark (#!) at the beginning of a script. It is also called sharp-exclamationsha-bang, hashbang, pound-bang, or hash-pling.

https://en.wikipedia.org/wiki/Shebang_(Unix)

When a text file with a shebang is used as if it is an executable in a Unix-like operating system, the program loader mechanism parses the rest of the file's initial line as an interpreter directive. The loader executes the specified interpreter program, passing to it as an argument the path that was initially used when attempting to run the script, so that the program may use the file as input data.

https://en.wikipedia.org/wiki/Shebang_(Unix)

For example, if a script is named with the path path/to/script, and it starts with the line #!/bin/sh, then the program loader is instructed to run the program /bin/sh, passing path/to/script as the first argument.

https://en.wikipedia.org/wiki/Shebang_(Unix)

Examples

Some typical shebang lines:

  • #!/bin/sh – Execute the file using the Bourne shell, or a compatible shell, assumed to be in the /bin directory
  • #!/bin/bash – Execute the file using the Bash shell
  • #!/usr/bin/pwsh – Execute the file using PowerShell
  • #!/usr/bin/env python3 – Execute with a Python interpreter, using the env program search path to find it
  • #!/bin/false – Do nothing, but return a non-zero exit status, indicating failure. Used to prevent stand-alone execution of a script file intended for execution in a specific context, such as by the . command from sh/bashsource from csh/tcsh, or as a .profile, .cshrc, or .login file.

https://en.wikipedia.org/wiki/Shebang_(Unix)

⇧ という説明になっており、

ってことらしいですと。

IBMさんの公開してる資料によると、

developer.ibm.com

⇧ sh(Bourne shell)が原初のシェルということのよう。

Bourne shellWikipediaの説明によると、

Bourne Shell(ボーンシェル)は、Unix Version 7 のデフォルトシェルでUnixで使われていたUnixシェルの一つである。POSIX規格で規定されるUnix系システムではBourne Shell後継のPOSIX準拠のシェルに置き換わっており、POSIXに準拠していないBourne Shellはすでに使われていない。

Bourne Shell - Wikipedia

/bin/shはかつてはBourne Shellだったが、現在はPOSIXシェルへのシンボリックリンクハードリンクになっている。多くのUnix系システムでは現在でもシェルスクリプトを記述するのに/bin/shが一般的に使われている。ただし、ユーザが通常使うシェルにはインタラクティブに適したPOSIX準拠シェルを用いることが一般的である。

Bourne Shell - Wikipedia

⇧ となっていて、Bourne shellは使われてないんかね?

利用

Bourne shell は全ての商用UNIXシステムで標準とされているが、BSD系のシステムには C Shell で書かれたスクリプトが多数存在する。Bourne shellスクリプトは GNU/Linux や他のUnix系システム上の bash や dash でもほとんど実行可能である。

Bourne Shell - Wikipedia

多くのLinuxシステムで、/bin/sh はbashへのハードリンクまたはシンボリックリンクとなっている。しかしUbuntuなどのLinuxシステムでは効率がよいことから /bin/sh を dash へのリンクとしている。

Bourne Shell - Wikipedia

⇧ とのことらしい。

そして、悲報...

語録

誰も Bourne shell の文法がどうなっているかを本当には知らない。ソースコードを調べてみてもほとんど役に立たない。— Tom Duff

Bourne Shell - Wikipedia

⇧ 先人の残した強烈なパワーワード...

/bin/shで実行とbin/bashで実行とで、実現できることが異なる罠

で、開発環境であれば、BashBash shell)は利用できるようになっていると信じたいが、稀に、Bashがインストールされていないってこともあるのよね。

さらに言うと、sh(Bourne shell)すらもインストールされていない時があるのよね。

まぁ、今回は、

どちらもインストールされているという前提で話を進めますが、

ja.linux-console.net

デフォルトでは、BashPOSIX に準拠していませんが、sh は POSIX に準拠しています。

sh シェルと Bash を比較する

Bash は、sh と比較して、より最新のコマンドライン言語を提供します。この点で、Bash をより快適に使用できるようになります。

sh シェルと Bash を比較する

Bashスクリプトを作成する場合、コードが Bash と互換性があることのみが保証されます。

一方、sh でスクリプトを作成する場合、コードは任意のシェルで実行できます。それは、sh が元のシェル スクリプト言語を定義しているためです。

sh シェルと Bash を比較する

⇧ とあるように、BashBash shell)が独自の機能を提供してるっぽいというのが分かったのは良いのだけど、困るのが、

の利用できる機能の差分が分かり辛いですと...

冒頭でも触れたのですが、特に気にせず、BashBash shell)で動くから大丈夫でしょうでコーディングしてたら、sh(Bourne shell)で動かないってことが多過ぎて、泥沼にハマったというね...

ネットの情報を漁っていたら、

stackoverflow.com

⇧ 上記でシェル毎に、利用できる機能などの比較表を載せて下さっているのですが、参照元のURLが404になるというね...

参照元のURL的には、バージニア大学が公開していた情報らしいのだけど、正しいかどうかが分からんという...

体感としては、関数まわりの差異が大きい気がする。

  • 関数の戻り値でreturn使えない
  • 関数の引数でdeclare -n使えない
  • sedでの削除ができない

あたりの事象に遭遇した感じです。

何と言うか、移植性を考えたら、sh(Bourne shell)を使うべしって情報が多いのだけど、肝心のsh(Bourne shell)についてのコーディングガイド的なものが無いんだが...

BashBash shell)については、

www.gnu.org

GNUが整備してくれてるんだけど、sh(Bourne shell)については、まとまった情報が見当たらんので、sh(Bourne shell)の利用を推奨するのであれば、まずは、コーディングガイド的な参照できる情報を教えて欲しいですな...

何と言うか、こういう利用できる機能の比較表のような情報こそ、AIで何とかならんもんかと思うのだけど、まぁ、無理なんだろうな...

ChatGPTに、お願いしてみたけど、一次情報についてツッコんだ途端に、根拠はありません、と濁されたのでね...

そして、

多くのLinuxシステムで、/bin/sh はbashへのハードリンクまたはシンボリックリンクとなっている。しかしUbuntuなどのLinuxシステムでは効率がよいことから /bin/sh を dash へのリンクとしている。

っていうWikipediaの情報だと、/bin/shは実質bashを使ってると読み取れそうな書きっぷりなんだが、bashで動くはずの機能が動かんやんけ、ってなったので、ブラックボックス過ぎるんよな...

ちなみに、「WSL 2(Windows Subsystem for Linux 2)」の「Ubuntu 22.04.2 LTS (GNU/Linux 5.15.133.1-microsoft-standard-WSL2 x86_64)」だと、

/bin/shシンボリックリンクは、dashということらしい。

まぁ、業務の環境は、CentOSだと思うから、Red Hat系と思われるので、Debian系のUbuntuとは変わってくるとは思うけど。

何やら、

qiita.com

⇧ シェルは闇が深そう...

2023年12月9日(土)追記:↓ ここから

「WSL 2(Windows Subsystem for Linux 2)」の「CentOS Linux 7 (Core)」だと、

/bin/shシンボリックリンクは、bashになっているのだが...

linux.just4fun.biz

⇧ 上記サイト様を参考に、シンボリックリンクの実体のフルパスを確認してみたところ、

⇧ /root/bash と表示されたのだけど、存在しないように見える...

う~む、結局、/bin/shは実質、何を使ってることになるのか分からんではないか...

2023年12月9日(土)追記:↑ ここまで

毎度モヤモヤ感が半端ない...

今回はこのへんで。