TLDR : Обернуть значение ключа в одинарные кавычки и префикс $
для специальной обработки.
Гипотеза 1
Выход из новых строк выполняется программой оболочки.
Тест 1
Создайте скрипт, который будет регистрировать аргументы, проанализированные в оболочке.
> echo "console.log(process.argv)" > shell-args.js
Run
> node shell-args.js x="Always\nEscape"
[ '/Users/alẹ́tilẹ́/.nvm/versions/node/v9.10.1/bin/node',
'/Users/alẹ́tilẹ́/Tests/shell-args.js',
'x=Always\\nEscape' ]
Гипотеза 2
Конкатенация и печать файла в качестве ввода оставляет аргумент оболочки как есть.
echo "Always\nEscape" > always_escape
Тест 2
Run
> node shell-args.js x="$(< always_escape)"
или
> node shell-args.js x="`< always_escape`"
[ '/Users/alẹ́tilẹ́/.nvm/versions/node/v9.10.1/bin/node',
'/Users/alẹ́tilẹ́/Tests/shell-args.js',
'x=Always\nEscape' ]
Гипотеза 3
Новые строки получают специальную обработку при использовании расширения ANSI C.
Из man bash
Слова вида $ 'string' обрабатываются специально. Слово расширяется до
строка с символами, экранированными обратной косой чертой, замененными в соответствии с
Стандарт ANSI C ... Расширенный результат заключен в одинарные кавычки, как если бы знак доллара отсутствовал.
Тест 3
Run
> node shell-args.js x=$'Always\nEscape'
[ '/Users/alẹ́tilẹ́/.nvm/versions/node/v9.10.1/bin/node',
'/Users/alẹ́tilẹ́/Tests/shell-args.js',
'x=Always\nEscape' ]
Заключение
Обернуть значение ключа в одинарные кавычки и префикс с $
для специальной обработки.