Куда делись все новые строки?

Если я использую curl в окне терминала в Ubuntu 16.04, чтобы запросить у WordPress некоторые секретные ключи, я получаю красивый вывод с каждым элементом в новой строке:

$ curl -s https://api.wordpress.org/secret-key/1.1/salt/
define('AUTH_KEY',         '6w$JwCO^;NW3vnWgQ|Hj=8T-K_ 7W/0|9WYKk`uVI|m/l#(y8^KYdvw,jo`l1qpz');
define('SECURE_AUTH_KEY',  'ccEN8qnoDVD|T#j7uCI%P+mt[tslr.> ZD=lr|y^XQ$/D)xGjvKqQ7_*v#,jVr+T');
define('LOGGED_IN_KEY',    'Qt)KLgcof#0TD0Sr3wC7jS=0}=8O]GVV(v+:^QfR|YtyP&N])8|@$tt!mFk]mQ:N');
define('NONCE_KEY',        '^9#+{Qh7H3PI1IUT5Ps~4v.-0FSA&*VKHHB|,:.uKIs(kj*vC4rD!,0&|`1HE^:E');
define('AUTH_SALT',        '{hL|~vC@{SSpK(t/{bu+LPej7Ld.J-X_hqB-|i8^0pMI3~$]Ta>*zr.JV-b{R?q9');
define('SECURE_AUTH_SALT', 'mn4oN^fSiEi->=v3_D;z608bebv#Nr crSh:Jk`FbmF;-<`X5X}<YD1fnx|:-$g ');
define('LOGGED_IN_SALT',   'V|`(qBQSQxw(ti-5vy!!8wviPI,cz!tfz1r?qvQzg,rW,w&K`-hRh.~w]yX^ui0h');
define('NONCE_SALT',       '?/N1{=`2Lp+c|6wK]m:@V-^FQY[.G7wb.pd6KQ@Z$&gF1s`ggKH;G|/3,d:qTlDZ');

Если я сначала сохраню результат в переменную, а потом посмотрю содержимое переменной, то все превратилось в однострочную кашу:

keys=$(curl -s https://api.wordpress.org/secret-key/1.1/salt/); echo; echo $keys

define('AUTH_KEY', 'Q$<~=k -4Dw6J05xHrzW`<4hg>.q?hbk|BV{y5b8Z$ddd-ZH]r2|0`?s<Q4#6.!k'); define('SECURE_AUTH_KEY', 'yV:ZN5sL&rLAN,Ss`~4>]WgtTIb[UG9s+BDNG=.zpN)r5~Ps>@Qxll0,@zz9F%h`'); define('LOGGED_IN_KEY', '+RW:%+<XAAiqD-~w!R(2+]vPD+%x/(|ur-$D+C8/U-F:ExkZ1O{05H5(Uk9#~(o]'); define('NONCE_KEY', ';aQuNt)c3#C~0F?vnh?12gxMY+z()0 t1y2_v2,?Sm`!uZppn+3pRwlXX}Rt8aL9'); define('AUTH_SALT', '1inr)T||(uk{Ivk?]~UR/=`}GlM|[Y`0%=_1)=p<EV&(b%wy,+EMG-xvY-G!tIF<'); define('SECURE_AUTH_SALT', '9+K!7eEQ5N&C#?`.D+0nTF-S|P!&n+O -|=n0;an|Pl78[|uQ9kbz,i+N_y/@p]r'); define('LOGGED_IN_SALT', 'NtDSfos]0/ ~x*4%22IVM:<XbNI1MKJw=>HHGg{|g91<zjXWR&Zhj*z&-j:7U2nS'); define('NONCE_SALT', '%Yo>D7nLM~IS|HrnSL<0&/4#-zW+M+b^d -Q pZ*9$Cu^@h)qFD9. |R&[?[p>cZ');

Мой вопрос: почему разрывы строк неправильно обрабатываются, когда строка присваивается переменной?


Примечание: чтобы задать этот вопрос в контексте, я пишу скрипт для автоматической установки WordPress. У меня уже есть решение, которое аккуратно добавляет уникальные значения соли в файл wp-config.php так, как я этого хочу, поэтому моя насущная проблема решена:

#!/usr/bin/env bash

source=wp-config-sample.php
target=wp-config.php

grep -A 1 -B 60 'since 2.6.0'                      $source > $target
curl -K -s https://api.wordpress.org/secret-key/1.1/salt/ >> $target
grep -A 60 -B 4 'Table prefix'                    $source >> $target

Просто меня смущает обработка переносов строк при присвоении строки переменной, и я хочу понять, что происходит и почему.


person James Newton    schedule 26.11.2017    source источник
comment
echo "$keys". Расширение параметров без кавычек является ошибкой, пока не доказано обратное.   -  person chepner    schedule 26.11.2017
comment
@chepner Расширение параметра без кавычек является ошибкой ‹‹ Можете ли вы уточнить это? Вы говорите, что символ новой строки — это параметр, который нужно расширить до пробела? Или что он удаляется и заменяется пробелом, если это опасно?   -  person James Newton    schedule 26.11.2017
comment
Это означает, что оставленные без кавычек символы новой строки рассматриваются как произвольные пробелы, которые можно использовать для разделения слов. В результате echo $keys передает несколько аргументов в echo, а не один аргумент со встроенными символами новой строки.   -  person chepner    schedule 26.11.2017
comment
Ссылки на переменные без кавычек подлежат разбиению на слова и использованию подстановочных знаков. Это почти никогда не то, что вам нужно, и может вызвать множество проблем.   -  person Gordon Davisson    schedule 26.11.2017
comment
Дополнительные сведения о цитировании см. в разделе stackoverflow.com/questions/10067266/   -  person tripleee    schedule 27.11.2017


Ответы (1)


echo преобразует разрывы строк без кавычек в пробелы:

$ X='a
> b'
$ echo $X
a b
$ echo "$X"
a
b
person AlexP    schedule 26.11.2017
comment
Я нашел это объяснение: stackoverflow.com/a/27872114/1927589 - person James Newton; 26.11.2017
comment
Точнее: расширение переменной без кавычек превращает новые строки (а также пробелы и табуляции) в разрывы между аргументами. echo использует пространство для объединения аргументов. Подробности смотрите по ссылке @JamesNewton. - person Gordon Davisson; 26.11.2017