在Google云构建步骤中使用bash脚本文件之前,如何从该文件中删除所有CR(\r)字符?

在Google云构建步骤中使用bash脚本文件之前,如何从该文件中删除所有CR(\r)字符?,bash,ubuntu,google-cloud-platform,google-cloud-build,Bash,Ubuntu,Google Cloud Platform,Google Cloud Build,在我的cloudbuild.yaml文件中有一个步骤,用于处理Ubuntu映像中的bash脚本文件。如果文件在Linux中编辑,它可以正常工作,但如果在Windows中编辑,它将失败,因为Windows文本编辑器通常使用CRLF而不是LF处理EOL - name: 'ubuntu' args: ['bash', './my-script.sh'] 脚本中的一个命令创建我的文件夹。我希望为每个生成创建文件夹,但当脚本最后一次在Windows中编辑时,该文件夹失败,并显示以下消息请注意下线处的

在我的cloudbuild.yaml文件中有一个步骤,用于处理Ubuntu映像中的bash脚本文件。如果文件在Linux中编辑,它可以正常工作,但如果在Windows中编辑,它将失败,因为Windows文本编辑器通常使用CRLF而不是LF处理EOL

- name: 'ubuntu'
  args: ['bash', './my-script.sh']
脚本中的一个命令创建我的文件夹。我希望为每个生成创建文件夹,但当脚本最后一次在Windows中编辑时,该文件夹失败,并显示以下消息请注意下线处的\r:

mkdir:无法创建目录“./my folder/\r”:没有这样的文件或目录


如何改进cloudbuild.yaml以消除此问题?

将构建步骤替换为:

- name: 'ubuntu'
  entrypoint: 'bash'
  args:
  - '-c' # pass what follows as a command to bash
  - |
    sed 's/\r$//' ./my-script.sh > sh

读取脚本文件时,它使用sed编辑器忽略所有CR\r字符,然后将内容传递给sh,sh将处理该内容。

将生成步骤替换为:

- name: 'ubuntu'
  entrypoint: 'bash'
  args:
  - '-c' # pass what follows as a command to bash
  - |
    sed 's/\r$//' ./my-script.sh > sh

它使用sed编辑器在读取脚本文件时忽略所有CR\r字符,然后将内容传递给sh,sh将对其进行处理。

假设这是可解析的,您可以使用shell模块将文件转换为unix格式。请参见下面的示例:

- name: Execute dos2unix on several files
  shell: dos2unix “{{ scripts_dir }}/*.sh"
  args:
    chdir: "/home/yourdir/"
这将把脚本转换成unix格式。然后可以像使用Ansible一样执行脚本

编辑 如果没有可用的dos2unix实用程序,可以在执行前使用Ansible进行安装:

- name: Install dos2unix
  apt:
    name: dos2unix
    state: present

假设这是Ansible,您可以使用shell模块将文件转换为unix格式。请参见下面的示例:

- name: Execute dos2unix on several files
  shell: dos2unix “{{ scripts_dir }}/*.sh"
  args:
    chdir: "/home/yourdir/"
这将把脚本转换成unix格式。然后可以像使用Ansible一样执行脚本

编辑 如果没有可用的dos2unix实用程序,可以在执行前使用Ansible进行安装:

- name: Install dos2unix
  apt:
    name: dos2unix
    state: present

您有访问常用实用程序dos2unix的权限吗?使用dos2unix可能会有所帮助,@John1024,但我使用sed修复了它。您认为我提出的解决方案有什么问题吗?dos2unix和sed可以做完全相同的事情。但是,对于sed,您可以尝试sed的/\r$/'sed的/\r$/'工作,并且比我最初的解决方案更清晰,因此我正在更新它。谢谢您有访问常用实用程序dos2unix的权限吗?使用dos2unix可能会有所帮助,@John1024,但我使用sed修复了它。您认为我提出的解决方案有什么问题吗?dos2unix和sed可以做完全相同的事情。但是,对于sed,您可以尝试sed的/\r$/'sed的/\r$/'工作,并且比我最初的解决方案更清晰,因此我正在更新它。谢谢转换是可能的,@SSF。但是你看到这个sed解决方案有什么问题吗?这可能会奏效。我还没有测试。也就是说,您可能需要在sed语句中包含其他字符。所以我建议使用一个覆盖所有字符的实用程序。明白了,谢谢。我将检查映像中是否有dos2unix。刚刚测试过,dos2unix不可用:启动容器进程导致exec:\dos2unix\:在$PATH中找不到可执行文件。因此,我将保留sed方法。谢谢。正如我在编辑中所说,如果它不可用,您可以使用apt-get安装它。转换可能是@SSF。但是你看到这个sed解决方案有什么问题吗?这可能会奏效。我还没有测试。也就是说,您可能需要在sed语句中包含其他字符。所以我建议使用一个覆盖所有字符的实用程序。明白了,谢谢。我将检查映像中是否有dos2unix。刚刚测试过,dos2unix不可用:启动容器进程导致exec:\dos2unix\:在$PATH中找不到可执行文件。因此,我将保留sed方法。谢谢。正如我在编辑中所说,如果它不可用,你可以使用apt-get安装。它在云构建中可以工作吗?我从来没有见过一个构建步骤有这样的论点…哪一个?dos2unix命令?它应该会起作用。您可以在shell步骤中使用脚本的绝对路径,这样您就可以让它工作,即用脚本的路径替换{{scripts_dir}}}。它在云构建中工作吗?我从来没有见过一个构建步骤有这样的论点…哪一个?dos2unix命令?它应该会起作用。您可以在shell步骤中使用脚本的绝对路径,这样就可以让它工作,即用脚本的路径替换{{scripts_dir}}。