所以我得到了以下任务:
- 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/sh
shell,大多数转义到 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