Capistrano/Ruby execute 是在变量后面加分号

Capistrano/Ruby execute is adding a semicolon after a variable

作为部署到服务器的 Capistrano Ruby 任务的一部分,我希望它输出 Git 消息并提交刚刚部署的代码。

有了这个:

git_message = `git log -1 HEAD --pretty=format:%s`
git_commit = `git rev-parse HEAD`
git_commit = "https://example.com/myorg/myrepo/commit/" + git_commit

execute "echo \"Deployed \\"#{git_message}\\": #{git_commit}\" | a_command_that_posts_to_slack"

它正在输出这样的东西:

Deployed "Merge branch 'feature/some-feature' into develop": https://example.com/myorg/myrepo/commit/0fdfa09fbfe012649fb0a998aa2e99cb5fd7c8b3;

请注意提交散列末尾的分号。我已经使用 puts 确认 git_commit 没有以分号结尾,git_message 没有分号,后面也没有分号。

什么添加了分号,我该如何删除它?

也许它正在执行 : 作为 Bash shell 内置命令,因此它试图用分号终止该命令?尝试删除 :。我还担心插入双引号,因为包含双引号的提交消息可能会让您有些头疼。

参考 Bash 内置 : What is the purpose of the : (colon) GNU Bash builtin?

这是因为你的命令中有换行符,Capistrano 将其翻译成分号,认为你想执行多个命令(每行一个)。

Ruby 中的反引号捕获进程的整个标准输出,包括尾随换行符。使用 chomp 删除它们。

git_message = `git log -1 HEAD --pretty=format:%s`.chomp
git_commit = `git rev-parse HEAD`.chomp
git_commit = "https://example.com/myorg/myrepo/commit/" + git_commit

execute "echo \"Deployed \\"#{git_message}\\": #{git_commit}\" | a_command_that_posts_to_slack"