Команда «sed» возвращает «Нет такого файла или каталога» при запуске с помощью доступного сценария?

В моем Ansible-скрипте есть команда, которая заменяет строку в файле. Команда отлично работает при запуске на моей машине. Однако, когда он запускается с моим ansible-скриптом, он говорит No such file or directory. Дело в том, что файл ДЕЙСТВИТЕЛЬНО существует, и 'sed' ДЕЙСТВИТЕЛЬНО заменил эту строку. Итак, команда выполнена успешно, но все равно выдает ошибку? Кто-нибудь знает, что может быть причиной этого?

Ansible задача

- name: Update path in plotly package
  become: true 
  shell: 
    cmd: 
    sed -e '2s/.*/DIR = "$( cd "$( /usr/bin/dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>\&1 \&\& pwd )"/' -i '' /plotly/app/venv/lib64/python3.9/site-packages/kaleido/executable/kaleido

Ошибка

TASK [packages/plotly : Replace line in plotly package] ********************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"changed": true, "cmd": "sed -e '2s/.*/DIR=\"$( cd \"$( \/usr\/bin\/dirname \"${BASH_SOURCE[0]}\" )\" >\/dev\/null 2>\\&1 \\&\\& pwd )\"/' -i '' /plotly/app/venv/lib64/python3.9/site-packages/kaleido/executable/kaleido", "delta": "0:00:00.004789", "end": "2024-07-30 16:16:24.704142", "msg": "non-zero return code", "rc": 2, "start": "2024-07-30 16:16:24.699353", "stderr": "sed: can't read : No such file or directory", "stderr_lines": ["sed: can't read : No such file or directory"], "stdout": "", "stdout_lines": []}

Пожалуйста, добавьте реальную задачу к вашему вопросу в виде блока кода. Одна только ошибка не так уж и важна.

tink 31.07.2024 02:32

@tink Обновлен вопрос с актуальной задачей.

bestfirstsearch 31.07.2024 02:58

И еще вопрос: ваша локальная машина — Mac? Поскольку синтаксис -i '' не используется GNU sed, как в большинстве дистрибутивов Linux...

tink 31.07.2024 03:15

@tink Я запускаю его на RedHat 8, но вручную запускаю команду на своем Mac.

bestfirstsearch 31.07.2024 03:25

Избавьтесь от '', попробуйте просто -i

tink 31.07.2024 03:33

Проблема переносимости с помощью sed -i рассматривается, например. в stackoverflow.com/questions/43171648/… но поскольку в самом Ansible есть лучшее решение, я не буду голосовать за закрытие его дубликата.

tripleee 31.07.2024 09:29

@tink Это исправило это для меня. Спасибо!

bestfirstsearch 31.07.2024 20:48

Рад это слышать... тем не менее: вам действительно следует использовать line-in-file, как предложил U880D в их ответе... использование sed не является тривиальным идемпотентом.

tink 31.07.2024 20:50
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
72
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

может быть вам нужен полный путь для отправки?

Ответ принят как подходящий

В вашем случае использования вместо этого рекомендуется использовать модуль lineinfile — Управление строками в текстовых файлах . Он менее подвержен ошибкам, имеет лучшую абстракцию и обработку ошибок, поддерживает check_mode , diff , изменен , имеет Safe_file_operations, может гарантировать идемпотентность и многое другое...


В любом случае, в системе RHEL для тестового файла типа

- This
- is
- a
- test.

менее рекомендуемый минимальный пример сборника сценариев

---
- hosts: localhost
  become: false
  gather_facts: false

  tasks:

  - shell:
      cmd: |
        sed --in-place '/ is/{
        s// was/g
        w /dev/stdout
        }' /home/ansible/test.txt
    register: result
    changed_when: result.stdout_lines | length | int > 0

  - debug:
      var: result

приведет к выводу

TASK [shell] **********************************
changed: [localhost]

TASK [debug] **********************************
ok: [localhost] =>
  result:
    changed: true
    cmd: |-
      sed --in-place '/ is/{
      s// was/g
      w /dev/stdout
      }' /home/ansible_user/test.txt
    delta: '0:00:00.006268'
    end: '2024-07-31 11:00:00.648871'
    failed: false
    msg: ''
    rc: 0
    start: '2024-07-31 11:00:00.642603'
    stderr: ''
    stderr_lines: []
    stdout: '- was'
    stdout_lines:
    - '- was'

PLAY RECAP ***********************************
localhost                  : ok=2    changed=1

и измененный файл

- This
- was
- a
- test.

Второй запуск приведет к

TASK [shell] *********************************
ok: [localhost]

TASK [debug] *********************************
ok: [localhost] =>
  result:
    changed: false
...

PLAY RECAP ***********************************
localhost                  : ok=2    changed=0

Дальнейшее чтение

Вероятно, также нужно подумать о Как сообщить об изменениях sed --in-place? , а также Как напечатать номера строк, измененные sed?

Отличная информация, спасибо!

bestfirstsearch 31.07.2024 20:48

Другие вопросы по теме