как использовать кавычки в sed и ssh?

Аргументы для интерпретатора в этом случае представляют собой аргументы, построенные после интерпретации строки shebang, комбинируя строку shebang с именем скрипта и его командными -строковыми аргументами.

Таким образом, сценарий AWK, начинающийся с

#! /usr/bin/awk -f

назвали myscriptи назвали

./myscript file1 file2

приводит к фактическим аргументам

/usr/bin/awk -f./myscript file1 file2

В данном случае единственным необязательным аргументом является -f. Не всем интерпретаторам нужен один (, см. /bin/sh, например, ), и многие системы допускают не более одного (, поэтому ваша строка shebang не будет работать так, как вы ожидаете ). Однако аргумент может содержать пробелы; все содержимое строки shebang после того, как интерпретатор передается как один аргумент.

Чтобы поэкспериментировать со строками шебанга, вы можете использовать #! /bin/echo(, хотя это не помогает различать аргументы, когда есть пробелы ).

См. Как запускаются программы для более подробного объяснения того, как обрабатываются строки shebang (в Linux ).

0
28.11.2019, 00:39
1 ответ

Использование идеи Джеффа об использовании здесь -документа для sedсамого скрипта (ну, он упоминает "здесь -строку", но у вас могут возникнуть проблемы с цитируя и там я думаю):

ssh host 'sed -i -f - /etc/mail/sendmail.mc' <<'SED_END'
s/dnl MASQUERADE_AS.*/MASQUERADE_AS(`domain.com')dnl/
SED_END

Если sedна удаленном узле может прочитать скрипт sedиз стандартного ввода с помощью -f -, то это, вероятно, будет работать (, в противном случае, например, на некоторых системах BSD, попробуйте-f /dev/stdin).

Команда вызывает sedна удаленном узле и передает сценарий редактирования sedна стандартный ввод. Сценарий sedзаключен в одинарные кавычки из-за кавычек в 'SED_END', поэтому оболочка не будет пытаться расширять свой текст.

Я также удалил конечный $в регулярном выражении, так как он не нужен(.*в любом случае будет соответствовать концу строки ).

Немного более короткий sedсценарий (, просто избегающий двойного упоминания MASQUERADE_AS):

s/dnl \(MASQUERADE_AS\).*/\1(`domain.com')dnl/
1
28.01.2020, 02:38

Теги

Похожие вопросы