Аргументы для интерпретатора в этом случае представляют собой аргументы, построенные после интерпретации строки 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 ).
Использование идеи Джеффа об использовании здесь -документа для 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/