Я пишу это в терминале:
printf ' \n\necho -e \"writes (>> appends) in note.txt this text'\n'on 2lines (with "-e" and "'\n'" help)\" >> note.txt\n' > note.txt
Я вкладываю это note.txt
:
echo -e "writes (>> appends) in note.txt this textnon 2lines (with "-e" and "n" help)" >> note.txt
Я хочу вложить это note.txt
:
echo -e "writes (>> appends) in note.txt this text\non 2lines (with "-e" and "\n" help)" >> note.txt
(\
- отсутствует),
Ну, я надеюсь, что это удовлетворяет Ваши потребности:
nano
echo -e 'writes(>> appends) in note.txt this text/non 2lines (with "-e" and "\n" help)' >> note.txt
(это - то, что я получил от Вашего вопроса), Оболочка interperlates специальные символы как обратная косая черта, кроме тех случаев, когда это окружается одинарными кавычками.
echo
берет аргументы, начинающиеся с тире, так чтобы быть дополнительным сейфом, необходимо использовать printf
вместо этого, как это:
$ printf %s 'A \n B \n'
A \n B \n
%s
просто средства печатают строку, я являюсь передающим как аргумент. Это часто используется как это:
$ variable=Flimm
$ printf '%s is all right\n' "$variable"
Flimm is all right
можно узнать больше об интерполяции Bash в страница справочника для bash
команда , искать наделенное правом ЗАКЛЮЧЕНИЕ В КАВЫЧКИ раздела. Также посмотрите страница справочника для printf
команда .
Символ \
является также символом ESC для себя, таким образом, можно добавить [еще 112] как так:
mgodby@mg-ws1:~$ echo -e '\n'
mgodby@mg-ws1:~$ echo -e '\\n'
\n
mgodby@mg-ws1:~$
еще один путь:
perl -e 'print q{ this preserves \n backslash-n and other special characters except close-squiggle (without a matching open-squiggle, which would be very rare) }' > note.txt
, если Ваше примечание имеет загогулину завершения, Вы можете, выбрал другой разделитель к q () функция:
perl -e 'print q| this works even with an unmatched close-squiggle like this one: } but it doesnt workt if i have a pipe in my text... |' > note.txt
, конечно, все эти методы (жемчуг или собственный printf) перестанут работать, если у Вас будет одинарная кавычка в Вашем документе. в этом случае можно быть в состоянии использовать двойные кавычки (пока Вы не имеете и единственный и удваиваетесь в своем тексте), например,
printf %s " I'm an idiot"
\
то, что Вы не хотите выходить из других символов.На основе содержания Вашей строки Вы, вероятно, хотите:
echo -e 'writes (>> appends) in note.txt this text\non 2 lines (with "-e" and "\\n" help)' >> note.txt
Текст это добавляет к note.txt
:
writes (>> appends) in note.txt this text
on 2 lines (with "-e" and "\n" help)
Изменения:
/n
где было похоже на желание разрыва строки. Таким образом, я изменил это на \n
.with "-e" and "\n"
, \
предназначается, чтобы быть распечатанным буквально, а не объединиться с n
следующий за этим и производят новую строку. Таким образом, я заключил в кавычки (оставленный) \
с другим \
. Если \n
продолжает новую линию, \\n
производит \n
.Я заменил внешние двойные кавычки ("
) с одинарными кавычками ('
). Вы хотели "
символы вокруг -e
и \n
чтобы быть распечатанными буквально, но вместо этого они закончили и перезапустили заключение в кавычки, препятствование тому, чтобы они были распечатаны и вызвали \n
на самом деле быть распечатанным как n
(потому что неупомянутое \n
обрабатывается прежде чем быть переданным echo
). Альтернативное решение состояло бы в том, чтобы записать \"
для внутренней части "
персонажи. Но не было никакой причины включить все это в двойные кавычки - одинарные кавычки обычно предпочтительны в случаях, где любой может использоваться.
Другое изменение - который не был изменением в заключительной команде, но был изменением, которое я внес только при работе над ним - было то, что я удалил >> note.txt
перенаправление, пока я не знал, что имел право команды. Путем отправки вывода в терминал я сразу смог видеть, каков эффект был. Я повторно добавил перенаправление, когда я был сделан.
Это является стилистически самым близким к тому, что Вы уже имели, но это не единственный способ сделать это.
echo
команды для отдельных строк, вместо использования -e
.Начиная с единственной последовательности Вы хотите рассматриваемый особенно эхом, \n
(между text
и on
), можно просто использовать два отдельных echo
команды и (поскольку muru может предлагать) не используют -e
.
Вот два способа перенаправить вывод нескольких команд:
Два отдельных перенаправления, один для каждой команды.
echo 'writes (>> appends) in note.txt this text' >> note.txt
echo 'on 2 lines (with "-e" and "\n" help)' >> note.txt
Если имя файла долго, или Вы пишете сценарий и только хотите должными быть изменить его в одном месте, можно присвоить его переменной:
out="/home/ek/Documents/long name that can have spaces as it's quoted/note.txt"
echo 'writes (>> appends) in note.txt this text' >> "$out"
echo 'on 2 lines (with "-e" and "\n" help)' >> "$out"
Единственное перенаправление относилось к составной команде, состоявшей из двух команд.
{
echo 'writes (>> appends) in note.txt this text'
echo 'on 2 lines (with "-e" and "\n" help)'
} >> note.txt
Можно поместить это на одну строку, если Вам нравится, но если нет никакой новой строки перед закрывающей фигурной скобкой (}
), точка с запятой (;
) должен предшествовать ему:
{ echo 'writes (>> appends) in note.txt this text'; echo 'on 2 lines (with "-e" and "\n" help)'; } >> note.txt
\n
кому: echo
вместо использования -e
.Реальные новые строки могут казаться в кавычках (единственными или двойными) и интерпретируются буквально:
echo 'writes (>> appends) in note.txt this text
on 2 lines (with "-e" and "\n" help)' >> note.txt
Поскольку первые концы строки в кавычках, оболочка не берет его в качестве конца команды, но вместо этого продолжает читать.
Если Вы действительно хотите соответствовать ему на одной строке, можно использовать $'\n'
, который расширяется до новой строки. Это расширено оболочкой прежде чем быть переданным echo
команда, таким образом, это не должно быть заключено в кавычки.
echo 'writes (>> appends) in note.txt this text'$'\n''on 2 lines (with "-e" and "\n" help)' >> note.txt
printf
printf
очень мощно; существует много способов, которыми Вы могли использовать его для решения этой проблемы. Так как я представляю это как отличное решение от других, вот хороший способ использовать его способом, Вы не можете использовать echo
:
printf '%s\n%s\n' 'writes (>> appends) in note.txt this text' 'on 2 lines (with "-e" and "\n" help)' >> note.txt
Общий синтаксис для printf
printf format args...
(где args...
нуль средств или больше дополнительных параметров командной строки). Строка формата выше, %s\n%s\n
, средства:
%s
: используйте и распечатайте следующее неиспользованное (т.е. сначала) аргумент в args...
(т.е. Ваша 1-я строка).\n
: распечатайте новую строку.%s
: используйте и распечатайте следующее неиспользованное (т.е. второй) аргумент в args...
(т.е. Ваша 2-я строка).\n
: распечатайте новую строку.Когда существует больше аргументов после строки формата, чем призывы строки формата, printf
команда запускается с начала строки формата. Таким образом, в то время как меньше самодокументирования, Вы могли на самом деле записать просто '%s\n'
(вместо '%s\n%s\n'
) для строки формата, и это произвело бы тот же вывод в этом случае.
Я не попытаюсь широко зарегистрировать printf
здесь. Вместо этого см.:
help printf
.printf
подраздел 4,2 Bash Встроенные Команды в справочнике удара.printf()
функция в стандартной библиотеке для C, который printf
команда на основе, и который упомянут явно в вышеупомянутых ресурсах. Документация относительно него, такая как эта страница, и более полна и более доступна, чем большинство источников на printf
команда. И синтаксис строки формата очень похож.cat
и здесь документ.Этот путь особенно ценен, когда существует много входа, и при сценариях. При использовании оболочки в интерактивном режиме вместо того, чтобы писать сценарий можно использовать это, но рассмотрите Путь 6 ниже сначала.
В то время как echo
и printf
текст печати на основе содержания их параметров командной строки, cat
печатает содержание его входных файлов (как указано на командной строке) или, если дали ни один (или передал -
), его стандартный вход.
Без перенаправлений стандартный вход - то, что Вы вводите на терминале управления программы. Здесь документы являются специальным видом перенаправления. Строки собраны до указанного ключевого слова (я использовал EOF
) появляется отдельно на строке. Затем строки до, но не включая EOF
(или независимо от того, что Вы использовали), даны как стандартный вход к выполняемой команде.
cat >> note.txt << EOF
writes (>> appends) in note.txt this text
on 2 lines (with "-e" and "\n" help)
EOF
Одно из различий между заключением в кавычки с "
и '
это большинство расширений и замен с $
(например, $varname
) выполняются в двойных кавычках, но ни один не находится в одинарных кавычках. Существует также два способа использовать здесь документы, на основе ли $
(и также `
и \
) должны даваться особое значение или рассматриваться буквально.
В этом случае это не имеет значения-$
и `
не появляйтесь, и \
только рассматривается особенно в здесь документ, когда он выходит из метасимвола оболочки (нет n
). Так же, как в единственных и двойных заключенных в кавычки выражениях, оба пути обработка \n
буквально. (Помните, необходимо было использовать специальную функцию echo
, включенный -e
, добираться \n
рассматриваемый особенно.)
Но таким образом, Вы знаете для других приложений:
$
, `
, и \
особенно, когда они появляются в контексте, где их особое значение применяется.<<
с '
, "
, \
, или комбинация этого (например, cat >> note.txt << 'EOF'
).cat
без любого перенаправления ввода.При использовании оболочки в интерактивном режиме по умолчанию стандартный вход оболочки взят от терминала. Когда Вы затем запускаете программу, по умолчанию что стандартный вход программы взят от Вашего терминала также. (Это может быть изменено перенаправлениями ввода, конечно.)
Таким образом, если Вы выполняете команду в интерактивном режиме и хотите использовать cat
с >>
или >
перенаправление вывода для отправки данных в файл Вам не нужно никакое перенаправление ввода. Просто войдите:
cat >> note.txt
writes (>> appends) in note.txt this text
on 2 lines (with "-e" and "\n" help)
^D
Вместо ^D
, не вводите литерал ^D
. Вместо этого нажмите Ctrl+D. Это предупреждает Ваш терминал, что он должен сообщить о конце файла (т.е. что, когда под управлением программа просит более вход, сказано, что нет ни одного оставленного, так же, как если бы он достиг конца регулярного файла, хранившего на диске). Когда cat
видит там больше не вводится, это выходит, и Вы возвращаетесь к оболочке.
Если Вы запишете сценарий, то Путь 6 не будет работать, потому что команды чтений удара из файла, но стандартного входа являются все еще (обычно) чем-то еще, таким как Ваш терминал.
Заметные различия между использованием cat
со здесь кошка документ и использование без перенаправления ввода, даже когда стандартный вход является Вашим терминалом, то, что:
cat >> note.txt
записи одна строка за один раз к note.txt
. Каждый раз, когда Вы нажимаете Enter, строка записана в note.txt
.cat >> note.txt << EOF
берет весь вход до EOF
строка, затем добавляет его к note.txt
. При прерывании входа путем нажатия Ctrl+C ничто не записано (и если note.txt
уже не существовал, это даже не создается).