Ansible 쉘 모듈은 명령 스위치를 존중하지 않습니다.

Ansible 쉘 모듈은 명령 스위치를 존중하지 않습니다.

그래서 다음과 같은 임무를 받았습니다.

- 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/shDash는 쉘로 이스케이프되는 대부분의 프로그램이 사용할 가능성이 있는 데비안 및 우분투 쉘입니다 . 그게 아마도 당신이 여기서 겪고 있는 문제일 겁니다.

를 사용하면 비호환성을 방지할 수 있습니다 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

관련 정보