В общем не могу разобраться, кучу времени уже убил. Вот синтетический пример:
$ echo '123\n456' | sed 's/5/\\n/'
123\n4\n6
$ cat myecho
#!/bin/bash
str=`echo '123\n456' | sed 's/5/\\n/'`
echo $str
$ ./myecho
123\n4 6
У одной и той же команды разный вывод в зависимости от того из скрипта она выполняется или из консоли. Никак не пойму почему. Сделать чтоб вывод был тот же я могу добавив ещё 2 слэша в сед, вот так:
sed 's/5/\\\\n/' но я не понимаю почему надо так делать и почему не работает без этого.
Update
Из мана к bash:
When the old-style backquote form of substitution is used, backslash retains its literal meaning except when followed by $, `, or \. The first backquote not preceded by a backslash terminates the command substitution. When using the $(command) form, all characters between the parentheses make up the command; none are treated specially.
Обратные кавычки считаются устаревшими, при их использовании бэкслэши обрабатываются как обычные символы, кроме тех случаев когда за ними идут $, ` или \. При использовании скобок всё выполняется как в консоли.