文字列置換の場合、bash shebangは機能しますが、sh shebangは機能しないのはなぜですか?

文字列置換の場合、bash shebangは機能しますが、sh shebangは機能しないのはなぜですか?

私はbuildkiteスクリプトで発生した問題を追跡してきましたが、これが私が得た結果です。

まず、dockerイメージのシェルを入力します。

docker run --rm -it --entrypoint bash node:12.21.0

このDockerイメージにはテキストエディタがないので、ファイルにリンクしてシェルスクリプトを作成しました。

touch a.sh
chmod +x a.sh
printf '#!/bin/sh\necho ${1:0:1}' >> a.sh

touch b.sh
chmod +x b.sh
printf '#!/bin/bash\necho ${1:0:1}' >> b.sh

これでスクリプトを実行します。

./a.sh hello
>./a.sh: 2: ./a.sh: Bad substitution 
./b.sh hello 
>h

誰かがここで何が問題なのかを簡単に教えてもらえますか?

このAskUbuntuの質問bashとshは異なるシェルであり、多くのシステムでは、shはbashにシンボリックリンクされています。

このドッカー画像に正確に何が起こりましたか?どうすればわかりますか?

ベストアンサー1

/bin/shPOSIXシェルであると予想され、POSIXシェルです。パラメータ拡張のサブストリングを認識しない

POSIX「コマンドソルバー(または「シェル」)を含む標準のオペレーティングシステムインターフェースと環境を定義します。」伝統的なUnixスタイルの環境で広く使用されている標準です。バラよりPOSIXとは何ですか?より広い説明のために。 POSIXベースの環境では/bin/shPOSIXスタイルのシェルを提供する必要/bin/shがあります/bin/sh。高度なシェルを使用するのは完璧ですが、それに応じてシェバンを調整する必要があります。

あなたのスクリプトはbashの機能に依存しているので、正しいshebangはそれが実行されている環境が何であるかに関係あり#!/bin/bashません。#!/usr/bin/env bash場合によってはただ働くかもしれませんが、#!/bin/shそれはただの幸せな偶然です。

おすすめ記事