printf -v 是 Bitbucket 管道中的非法選項。還有一個關於<<
您好,我是 shell 腳本的新手,如果這是微不足道的,請見諒。您如何使用
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
似乎執行。但據我了解,<<
這種變化並沒有真正意義。任何幫助將不勝感激。我的大多數團隊都在度假,所以我很難過。提前致謝 :)
printf -v BITBUCKET_COMMIT_str %q "$BITBUCKET_COMMIT" echo "commit string $BITBUCKET_COMMIT_str" deployment.sh: 28: printf: Illegal option -v
這看起來像是來自 Dash,Debian 的
/bin/sh
. 這就是腳本開頭的 hashbang 是否正確的問題,但您已經在評論中提到了這一點。的解決方法
-v
是使用命令替換,var=$(printf whatever)
但是你會遇到一個問題%q
,因為 Dash 也不支持它,而且由於${var/pattern/replacement}
也不支持擴展,所以替換起來有些困難。但是看看下一行。您正在使用該變數
BITBUCKET_COMMIT_str
向使用者列印。這並不一定需要對 shell 輸入有效的引用,這就是這樣%q
做的。(%q
甚至不會產生好看的輸出,它優先使用反斜杠而不是僅使用單引號。)因此,如果這是您使用變數的唯一位置,並且它不包含例如換行符(如果它是送出 id或者這樣,它可能不會),你可能完全跳過printf
,並使用這樣的東西:echo "commit string '$BITBUCKET_COMMIT'"
如果你真的需要 Bash
%q
並且 Bash 完全可用,一個明顯但非常過分的解決方案是呼叫 Bash 來做到這一點:quotedvar=$(bash -c 'printf %q "$1"' bash "$var")