그래서 다음과 같은 임무를 받았습니다.
- 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
/bin/sh
Dash는 쉘로 이스케이프되는 대부분의 프로그램이 사용할 가능성이 있는 데비안 및 우분투 쉘입니다 . 그게 아마도 당신이 여기서 겪고 있는 문제일 겁니다.
를 사용하면 비호환성을 방지할 수 있습니다 printf
. 이는 표준 도구이며 비호환성이 적습니다(항상 처리 \n
등).
shell: printf "First Line\n " > "/tmp/{{ ansible_date_time.date }}_test.txt"
따옴표를 사용하는 경우 옵션은 유틸리티 자체에서 처리되며 따옴표는 전적으로 쉘 구성이므로 예를 사용하거나 echo '-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'
다음은 쉘에 내장된 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