Bash

printf -v 是 Bitbucket 管道中的非法選項。還有一個關於<<

  • July 8, 2020

您好,我是 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" &lt;&lt;\HERE
    echo "TEST MADE IT HERE"
    BUILD_FOLDER="BUILD_$BITBUCKET_COMMIT"
    echo "Build: $BUILD_FOLDER"
   ...
   HERE

另一方面,我不完全確定上述腳本試圖做什麼。我一直無法找到該bash -s命令的作用。我認為這個命令試圖附加一個包含HERE塊內容的文件。塊內的腳本HERE似乎沒有執行,除非我更改&lt;&lt;為塊&gt;&gt;內的程式碼HERE似乎執行。但據我了解,&lt;&lt;這種變化並沒有真正意義。

任何幫助將不勝感激。我的大多數團隊都在度假,所以我很難過。提前致謝 :)

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")

引用自:https://unix.stackexchange.com/questions/597196