Ansible shell 模块不尊重命令开关

Ansible shell 模块不尊重命令开关

所以我得到了以下任务:

- name: "Use echo."
  shell: echo -e "First Line\n " > "/tmp/{{ ansible_date_time.date }}_test.txt"
  delegate_to: localhost
  become: 'no'
  changed_when: 'false'
  run_once: 'yes'

当查看生成的文件时,我得到:

-e First Line
<newline printed properly>

我想要的是:

First Line
<newline printed properly>

我基本上尝试了各种形式的引用,那么我错过了什么?

答案1

由于各种历史原因,不同版本对echo他们的论点的处理方式有所不同......

$ bash -c 'echo -e hello'
hello
$ dash -c 'echo -e hello'
-e hello

Dash 是 Debian 和 Ubuntu 的/bin/shshell,大多数转义到 shell 的程序都可能使用该 shell。这可能就是你在这里遇到的问题。

您可以通过使用来避免不兼容printf。它是一个标准工具,并且具有较少的不兼容性(并且始终处理\n等):

shell: printf "First Line\n " > "/tmp/{{ ansible_date_time.date }}_test.txt"

至于使用引号,选项是由实用程序本身处理的,而引号完全是一个shell构造,因此无论您使用egecho '-e'还是echo -e,它本身看到的echo都是完全相同的。

也可以看看:

答案2

这是一个解决方法,使用二进制文件/bin/echo而不是外壳内置 echo命令。

- name: "Use echo."
  shell: /bin/echo -e "First Line\n " > "/tmp/{{ ansible_date_time.date }}_test.txt"
  delegate_to: localhost
  become: 'no'
  changed_when: 'false'
  run_once: 'yes'

以下是关于 shell 内置 echo 命令的解释:

$ which echo
echo: shell built-in command

$ ls -l /bin/echo
-rwxr-xr-x 1 root root 39256 Sep  5  2019 /bin/echo

这是提供二进制文件的包/bin/echo

$ dpkg -S /bin/echo  # Ubuntu/Debian distro
coreutils: /bin/echo

相关内容