Bash
由於錯誤辨識的令牌,在 Jenkins 下執行的腳本失敗
我正在 Jenkins CI/CD 軟體中創建一個建構作業。建構作業將從 Github 複製我的 android 項目並生成 APK。我正在使用 Ubuntu 20.04 LTS 伺服器作業系統。
作為建構步驟的一部分,我正在通過 Jenkins 執行以下命令:
rm -r app/src/main/java/in/myproj/utils/Constants.kt
但收到以下錯誤:
/tmp/jenkins10737829520192897047.sh: 1: Syntax error: "in" unexpected
看起來 bash 將文件夾名稱
in
視為Constant
. 從今天早上開始,我一直在努力尋找解決方案,但慘遭失敗。任何幫助是極大的讚賞。編輯:
我已經進一步調試了這個問題並找到了實際原因。失敗的不是
rm
命令。我還有另一個建構步驟,我將一些程式碼片段附加到文件中。以下是實際失敗的程式碼片段:cat << EOT >> app/src/main/java/in/myproj/utils/Constants.kt "package `in`.myproj.utils class Constants { companion object { const val BASE_URL = "https://api.example.in/api/" const val BASE_URL_IMAGE_ADDRESS = "https://dashboard.example.in:5555/" const val BASE_URL_PROFILE_IMAGE_ADDRESS = "https://api.example.in/" const val ABOUT_US_URL = "https://example.in/aboutus.html" const val PRIVACY_POLICY_URL = "https://example.in/privacy-policy.html" const val TERMS_AND_CONDITIONS_URL = "https://example.in/terms-condition.html" const val REQUEST_TIMEOUT_DURATION = 10 const val STATUS_SUCCESS = 1
問題在於您如何使用 EOT。當使用不帶引號的單詞作為 heredoc 分隔符時,heredoc 的內容將在寫入之前由 shell 擴展。如bash 手冊中所述:
如果 word 的任何部分被引用,則分隔符是 word 上引號刪除的結果,並且 here-document 中的行不展開。如果 word 不加引號,則對 here-document 的所有行進行參數擴展、命令替換和算術擴展,字元序列 \newline 被忽略,並且必須使用 ‘' 來引用字元 ‘'、’$ ‘,和’`’。
因此,
in
shell 會讀取 heredoc 中的 ,作為命令替換,因此它會嘗試執行命令in
並返回其輸出。實際上,這意味著您需要引用
EOT
:cat << 'EOT' >> app/src/main/java/in/myproj/utils/Constants.kt
請注意,這意味著您在此處文件中可能擁有的任何變數也不會被擴展,但由於我在您的問題中看不到任何變數,因此我假設這不是問題。