Вслед за ваш предыдущий вопрос , это звучит , как вы хотите , и некоторые неосмысленный текст и некоторые интерпретировать текст происходят в файл. В этом случае используйте два разных cats (или echos):
cat > /test <<'EOF'
some uninterpreted text $(pwd)
not substituted: $1
EOF
cat >> /test <<EOF
but this will substitute: $1
EOF
Здесь происходит пара вещей: во-первых, синтаксис heredoc с <<. Если вы включите кавычки в эту строку терминатора, как в первом примере выше, весь heredoc не интерпретируется - без параметров и без подстановок. Если вы не используете кавычки, как во втором cat выше, переменные наподобие $1будут заменены их значениями, а подстановки команд будут включены в текст. Вы выбираете, заключить в кавычки строку «EOF» или нет, основываясь на том, хотите ли вы замены или нет.
Чтобы поместить оба catфайла в один и тот же файл, мы используем >> перенаправление для второго (и любого более позднего) перенаправления: это означает добавление в файл. Для первого мы используем один, >чтобы очистить файл и начать все заново.
Обратите внимание, что даже при замене переменных любые дополнительные знаки доллара в значении этой переменной сами по себе не заменяются:
foo='$bar'
bar=hello
cat <<EOF
$foo
EOF
будет выводить:
$bar
без подстановки в $barзначение.
Однако, если вы указываете «$» в качестве аргумента для всего этого сценария, вам нужно экранировать его в командной строке или заключить все это в одинарные кавычки. В качестве альтернативы, подстановка команд, как и в вашем другом вопросе, позволяет вам поместить содержимое всего файла напрямую, включая любые знаки доллара в содержимом файла. Убедитесь, что вы указали там строку подстановки:
oo.sh "$(cat myfile)"
получит тело myfileкак $1и может тогда catили echoэто как требуется. Здесь применимы те же ограничения, что и в моем ответе : есть ограничение на длину аргументов командной строки, и если ваш файл может стать длиннее, вы должны найти другой подход. Вы можете узнать, какой лимит в вашей системе сgetconf ARG_MAX
$1) содержит знаки доллара.' Нет, если это относится к первому параметру командной строки. Замена была выполнена до того, как ваш скрипт был выполнен. Вы должны избежать этого в командной строке.