printf -vはBitbucketパイプラインの無効なオプションです。 <<[閉じる]に関する別の質問があります。

printf -vはBitbucketパイプラインの無効なオプションです。 <<[閉じる]に関する別の質問があります。

こんにちは、私は初めてシェルスクリプトに触れました。些細なことだったらすみません。printfオプションでコマンドを使用する方法は-v

私たちのdeployment.shファイルには次の行があります printf -v BITBUCKET_COMMIT_str %q "$BITBUCKET_COMMIT"

echo 'Initializing new deployment'
printf -v BITBUCKET_COMMIT_str %q "$BITBUCKET_COMMIT"
echo "commit string $BITBUCKET_COMMIT_str"

Bitbucketパイプラインが実行されると、常にこの行で失敗します。エラーがありますprintf -v is an illegal option

Bitbucketのエラー


Initializing new deployment
commit string 
deployment.sh: 28: printf: Illegal option -v
bash: -c: line 1: syntax error: unexpected end of file
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! XXXXX deploy: `sh deployment.sh`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the XXXX deploy script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/XXX-debug.log

私はローカル端末でコマンドをテストしましたが、うまく動作しますが、printf -vBitbucketビルドパイプラインではなぜ動作しないのかわかりません。変数に置き換えようとしましたが、printfファイルに構文エラーが発生しました。変数を別のコマンドの入力として使用しようとしているためです。

"bash -s $BITBUCKET_COMMIT_str" <<\HERE
     echo "TEST MADE IT HERE"
     BUILD_FOLDER="BUILD_$BITBUCKET_COMMIT"
     echo "Build: $BUILD_FOLDER"
    ...
    HERE

一方、上記のスクリプトが何をしたいのか完全にはわかりません。このbash -sコマンドが何をしているのかが見つかりませんでした。私の考えでは、このコマンドはHEREチャンクコンテンツを含むファイルを追加したいようです。 「ブロック内のコードが実行されているように見える」に変更しないと、ブロック内のスクリプトが実行されないようですHERE。しかし、私が理解している限り、これらの変更は実際には意味がありません。<<>>HERE<<

どんな助けでも大変感謝します。私たちのチームのほとんどは休暇中で、大変な時間を過ごしています。よろしくお願いします:)

答え1

printf -v BITBUCKET_COMMIT_str %q "$BITBUCKET_COMMIT"
echo "commit string $BITBUCKET_COMMIT_str"

deployment.sh: 28: printf: Illegal option -v

これはDebian Dashのエラーメッセージのように見えます/bin/sh。問題は、スクリプトの最初のハッシュバンが正しいことです。しかし、すでにコメントで言及されています。

回避策-vはコマンド置換を使用することですが、Dashがそれをサポートせず、拡張もサポートされていないため、交換が少し難しいため、var=$(printf whatever)問題が発生します。%q${var/pattern/replacement}

しかし、次の行を見てください。この変数を使用してBITBUCKET_COMMIT_strユーザーに印刷します。シェル入力に引用が有効である必要はありません%q。これは必須です。 (%qきれいな出力を生成せず、一重引用符よりもバックスラッシュを好むprintf)スキップして次のように使用できます。

echo "commit string '$BITBUCKET_COMMIT'"

もしあなたなら本物Bashは必須%qで、Bashは完全に利用可能です。明らかな非常に大胆な解決策は、Bashを呼び出してこれを行うことです。

quotedvar=$(bash -c 'printf %q "$1"' bash "$var")

関連情報