こんにちは、私は初めてシェルスクリプトに触れました。些細なことだったらすみません。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 -v
Bitbucketビルドパイプラインではなぜ動作しないのかわかりません。変数に置き換えようとしましたが、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")