私は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/sh
POSIXシェルであると予想され、POSIXシェルです。パラメータ拡張のサブストリングを認識しない。
POSIX「コマンドソルバー(または「シェル」)を含む標準のオペレーティングシステムインターフェースと環境を定義します。」伝統的なUnixスタイルの環境で広く使用されている標準です。バラよりPOSIXとは何ですか?より広い説明のために。 POSIXベースの環境では/bin/sh
POSIXスタイルのシェルを提供する必要/bin/sh
があります/bin/sh
。高度なシェルを使用するのは完璧ですが、それに応じてシェバンを調整する必要があります。
あなたのスクリプトはbashの機能に依存しているので、正しいshebangはそれが実行されている環境が何であるかに関係あり#!/bin/bash
ません。#!/usr/bin/env bash
場合によってはただ働くかもしれませんが、#!/bin/sh
それはただの幸せな偶然です。