У меня есть скрипт «myscript», который выводит следующее:
abc
def
ghi
в другом сценарии я звоню:
declare RESULT=$(./myscript)
и $RESULT
получает значение
abc def ghi
Есть ли способ сохранить результат либо с символами новой строки, либо с символом '\ n', чтобы я мог вывести его с помощью ' echo -e
'?
Ответы:
На самом деле, RESULT содержит то, что вы хотите - продемонстрировать:
То, что вы показываете, это то, что вы получаете от:
Как отмечено в комментариях, разница состоит в том, что (1) версия переменной () в двойных кавычках
echo "$RESULT"
сохраняет внутренний интервал значения в точности так, как он представлен в переменной - новые строки, табуляции, несколько пробелов и все - в то время как (2 ) версия без кавычек (echo $RESULT
) заменяет каждую последовательность из одного или нескольких пробелов, табуляции и новых строк одним пробелом. Таким образом, (1) сохраняет форму входной переменной, тогда как (2) создает потенциально очень длинную единственную строку вывода с «словами», разделенными пробелами (где «слово» - это последовательность непробельных символов; Никаких буквенно-цифровых символов в любом из слов).источник
Другая ловушка с этим - то, что замена команды -
$()
- удаляет завершающие строки. Возможно, это не всегда важно, но если вы действительно хотите сохранить именно то , что было выведено, вам придется использовать другую строку и несколько цитат:Это особенно важно, если вы хотите обработать все возможные имена файлов (чтобы избежать неопределенного поведения, например, работы с неправильным файлом).
источник
pwd=`pwd`; ls $pwd/$file
, вы получили новую строку перед/
, и заключение в двойные кавычки не помогло. Это было исправлено быстро. Это было в 1983-5 годах на ICL Perq PNX; оболочка не имеет$PWD
встроенной переменной.В случае, если вас интересуют конкретные строки, используйте массив результатов:
источник
readarray
и процесс замены вместо подстановки команды:readarray -t RESULT < <(./myscript>
.В дополнение к ответу, данному @ l0b0, у меня просто была ситуация, когда мне нужно было сохранить любые завершающие строки, выводимые скриптом, и проверить код возврата скрипта. И проблема с ответом l0b0 состоит в том, что 'echo x' сбрасывал $? вернуться к нулю ... так что мне удалось придумать это очень хитрое решение:
источник
die ()
функцию, которая принимает произвольный код выхода и, возможно, сообщение, и я хотел использовать другуюusage ()
функцию для доставки сообщения, но переводы строки продолжали сжиматься, надеюсь, это позволит мне обойти это.Попробовав большинство решений здесь, я обнаружил, что проще всего было использовать временный файл. Я не уверен, что вы хотите сделать со своим многострочным выводом, но вы можете справиться с ним построчно, используя read. Единственное, что вы не можете сделать, это просто вставить все в одну переменную, но для большинства практических целей это гораздо проще.
Быстрый взлом, чтобы заставить его выполнить запрошенное действие:
Обратите внимание, что это добавляет дополнительную строку. Если вы работаете над этим, вы можете кодировать его, я просто слишком ленив.
РЕДАКТИРОВАТЬ: Хотя этот случай работает очень хорошо, люди, читающие это, должны знать, что вы можете легко сжать свой стандартный ввод в цикле while, что даст вам скрипт, который будет запускать одну строку, очищать стандартный ввод и выходить. Как ssh сделает то, что я думаю? Я недавно видел это, другие примеры кода здесь: /unix/24260/reading-lines-from-a-file-with-bash-for-vs- while
Еще один раз! На этот раз с другим дескриптором файла (stdin, stdout, stderr 0-2, поэтому мы можем использовать & 3 или выше в bash).
Вы также можете использовать mktemp, но это всего лишь быстрый пример кода. Использование для mktemp выглядит так:
Затем используйте $ filenamevar так же, как действительное имя файла. Вероятно, не нужно объяснять здесь, но кто-то жаловался в комментариях.
источник
bash
ошибок .read
расширение команды-u 3
для чтения из файлового дескриптора 3.Как насчет этого, он будет читать каждую строку переменной, и это может быть использовано впоследствии! скажем, вывод myscript перенаправляется в файл с именем myscript_output
источник