Есть ли способ заставить bash не есть новые строки в замене обратного удара?
Например:
var=`echo line one && echo line two`
echo $var
line one line two
Что я хочу это
var=`echo line one && echo line two` # plus some magic
echo $var
line one
line two
bash
выполняет параметры расширения перед выполнением команды, цитируя необходимо сообщить ,bash
что вы хотите напечатать одну строку , а не 4 слов (line
,one
,line
иtwo
). Попробуйте:echo a <many spaces> b
иecho "a <many spaces> b"
. Посмотрите на этот ответ тоже.Даже если @cyrus верен - он на самом деле не отвечает на весь вопрос, и нет объяснения тому, что происходит.
Итак, давайте пройдемся по нему.
Новые строки в строке
Сначала определите ожидаемую последовательность байтов:
Теперь используйте команду подстановки (раздел 3.5.4), чтобы попытаться перехватить эту последовательность байтов:
Затем выполните простое эхо для проверки последовательности байтов:
Таким образом, кажется, что первая новая строка была заменена пробелом, а вторая новая строка осталась нетронутой. Но почему ?
Давайте посмотрим на то, что на самом деле здесь происходит:
Во-первых, bash сделает расширение параметров оболочки (раздел 3.5.3)
Затем bash выполнит разделение слов (раздел 3.5.7).
Далее, bash будет рассматривать это как простую команду (раздел 3.2.1)
Определение пробелов (Раздел 2 - Определения)
Наконец, bash вызывает внутреннюю команду echo (Раздел 4.2 - Команды Bash)
Таким образом, чтобы подвести итог, новые строки удаляются Word Splitting, а затем echo получает 2 аргумента, «a» и «b», а затем выводит их разделенные пробелами и заканчивая символом новой строки.
Делая то, что предложил @cyrus (и подавив перевод строки из echo с -n), результат получится лучше:
Новые строки в конце строки
Это все еще не идеально, хотя завершающий символ новой строки исчез. Присмотревшись к подстановке команд (раздел 3.5.4) :
Теперь, когда стало ясно, почему символ новой строки исчезает, bash можно обмануть, чтобы сохранить его. Для этого добавьте в конец дополнительную строку и удалите ее при использовании переменной:
TL; DR
Добавьте дополнительную часть в конец вывода и заключите в кавычки переменные:
источник
Я бы добавил свое небольшое дополнение в комментарии к ответу cYrus, но пока не могу комментировать ответы, которые мне кажется. Поэтому я напишу часть ответа cYrus для полноты.
Что происходит в первой строке вашего кода, так это то, что подстановка обратных кавычек поглощает завершающие символы новой строки выходных данных замещенной команды, как описано в документации . Но он не ест новую строку между вашими двумя строками.
Во второй строке кода происходит то, что echo выполняется с двумя аргументами: первой и второй. Кавычка в расширенной переменной исправит это:
echo "$var"
Это сохранит перевод строки между первой и второй строкой. Иecho
добавит завершающий перевод строки по умолчанию, чтобы все было в порядке.Теперь, если вы хотите сохранить все завершающие символы новой строки в выходных данных какой-либо подстановки команд, обходной путь - добавить еще одну строку выходных данных, которую вы можете удалить после подстановки команд, см. Здесь .
источник