В бытность свою bash-юзером приучил меня один хороший человек по-быстрому всякие вещи проверять конструкциями типа:
|
echo "some code with \n, \t etc" > file && doing something with file && rm file
|
или даже
|
echo "some code with \n, \t etc" | doing something with echoed code && rm file
|
Перейдя на zsh, обнаружил, что он echo с escape-последовательностями обрабатывает как-то странно:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
% echo "#include <iostream>\n\nusing namespace std;\n\nint main() {\n\treturn 0;\n}"
using
int return 0; }"#include <iostream>
using namespace std;
int main() { return 0; } %
|
bash делает именно то, что я хочу:
|
minoru@eternity:~$ echo -e "#include <iostream>\n\nusing namespace std;\n\nint main() {\n\treturn 0;\n}" #include <iostream>
using namespace std;
int main() { return 0; } minoru@eternity:~$
|
Интересным наблюдением является то, что весь zsh'евский «мусор» сыплется в stderr:
|
% echo -e "#include <iostream>\n\nusing namespace std;\n\nint main() {\n\treturn 0;\n}" >/tmp/file
using
int return 0; }"% %
|
(Знак процента в предпоследней строке означает, что zsh принудительно вставил там перевод строки, чтобы приглашение отобразилось правильно — то есть с новой строки)
Понятное дело, что тут работают магические фичи zsh (которые обычно идут на благо), но вот какие именно — непонятно. Было бы неплохо, если бы кто-то мне объяснил, почему это работает именно так и, опционально, как это починить (сделать так, чтобы работало как в bash).
Дополнительная информация:
zsh 4.3.6 (x86_64-unknown-linux-gnu)
.zshrc
Решение
Оказалось, что причиной проблемы была функция preexec, с помощью которой я устанавливал заголовок окна терминала:
|
preexec() { print -Pn "\e]0;`echo $1 | sed -r 's/^(sudo [^[:space:]]+|[^[:space:]]+).*/\1/'`\a" }
|
Стоило немного её поправить, и всё заработало правильно:
|
preexec() { print -Pn "\e]0;`echo $1 | head -n1 | sed -r 's/^(sudo [^[:space:]]+|[^[:space:]]+).*/\1/'`\a" }
|