Вот что-то похожее на ответ @GinkgoFr, но без проблем, выявленных @Tino или @DejayClayton,
и является более надежным, чем умный set -o posix
бит @ DouglasLeeder:
+ function SOLUTION() { (set +o posix; set) | sed -ne '/^\w\+=/!q; p;'; }
Разница в том, что это решение ОСТАНАВЛИВАЕТСЯ после первого не переменного отчета, например, первая функция, о которой сообщает set
Кстати: проблема "Тино" решена. Даже если POSIX выключен, а о функциях сообщается set
,
* * * * * часть решения позволяет только через переменные отчеты (например, VAR=VALUE
строки).
В частности, A2
не случайно делает его на выходе.
+ function a() { echo $'\nA2=B'; }; A0=000; A9=999;
+ SOLUTION | grep '^A[0-9]='
A0=000
A9=999
И: проблема «DejayClayton» решена (встроенные символы новой строки в значениях переменных не нарушают вывод - каждая VAR=VALUE
получает одну строку вывода):
+ A1=$'111\nA2=222'; A0=000; A9=999;
+ SOLUTION | grep '^A[0-9]='
A0=000
A1=$'111\nA2=222'
A9=999
ПРИМЕЧАНИЕ. Решение, предоставляемое @DouglasLeeder, страдает от проблемы «DejayClayton» (значения со встроенными символами новой строки).
Ниже A1
неверно и A2
вообще не должно отображаться.
$ A1=$'111\nA2=222'; A0=000; A9=999; (set -o posix; set) | grep '^A[0-9]='
A0=000
A1='111
A2=222'
A9=999
НАКОНЕЦ: Я не думаю, что версия bash
имеет значение, но это возможно. Я провел тестирование / разработку на этом:
$ bash --version
GNU bash, version 4.4.12(1)-release (x86_64-pc-msys)
POST-SCRIPT: Учитывая некоторые другие ответы на OP, у меня остается <100% уверенность в том, что <code>set всегда преобразует переводы строки в значение в \n
, что зависит от этого решения чтобы избежать проблемы "DejayClayton". Возможно, это современное поведение? Или вариант во время компиляции? Или параметр set -o
или shopt
? Если вы знаете о таких вариациях, пожалуйста, добавьте комментарий ...