Minoru 18.03.2010 01:29
Есть вопрос! — [Решено] ZSH и echo
В бытность свою bash-юзером приучил меня один хороший человек по-быстрому всякие вещи проверять конструкциями типа:
1 |
|
1 |
|
1 |
% echo "#include <iostream>\n\nusing namespace std;\n\nint main() {\n\treturn 0;\n}"
|
1 |
minoru@eternity:~$ echo -e "#include <iostream>\n\nusing namespace std;\n\nint main() {\n\treturn 0;\n}"
|
1 |
% echo -e "#include <iostream>\n\nusing namespace std;\n\nint main() {\n\treturn 0;\n}" >/tmp/file
|
Понятное дело, что тут работают магические фичи zsh (которые обычно идут на благо), но вот какие именно — непонятно. Было бы неплохо, если бы кто-то мне объяснил, почему это работает именно так и, опционально, как это починить (сделать так, чтобы работало как в bash).
Дополнительная информация:
zsh 4.3.6 (x86_64-unknown-linux-gnu)
.zshrc
Решение
Оказалось, что причиной проблемы была функция preexec, с помощью которой я устанавливал заголовок окна терминала:
1 |
|
1 |
preexec() {
|
Закомментировал в своём конфе всё, что могло повлиять на ситуацию (set BRACECCL), выдернул из твоего те части, что могли бы помочь — ноль эффекта, все равно та же фигня :(
Может, это из-за версии? У меня zsh 4.3.6 (x86_64-unknown-linux-gnu)
Может, это из-за версии? У меня zsh 4.3.6 (x86_64-unknown-linux-gnu)
Additionally the BSD_ECHO and IGNORE_BRACES options are set if zsh is invoked as sh
может быть поможет быть ^_^попробуй кстати /bin/echo
Пытался делать unset указанных опций — никак не влияет. Аналогично, если делал set.
Если использовать /bin/echo, получаем следующее:
Если использовать /bin/echo, получаем следующее:
% /bin/echo "#include <iostream>\n\nusing namespace std;\n\nint main() {\n\treturn 0;\n}" ~
using
int
return 0;
}"#include <iostream>\n\nusing namespace std;\n\nint main() {\n\treturn 0;\n}
%
С опцией -e /bin/echo ведёт себя так же, как и zsh'евский built-in:% /bin/echo -e "#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;
}
%
$ zsh --version
zsh 4.3.6 (i686-pc-linux-gnu)
$ echo -e "#include \n\nusing namespace std;\n\nint main() {\n\treturn 0;\n}" > /tmp/file
$ cat /tmp/file
#include
using namespace std;
int main() {
return 0;
}
$
конфиг, стырен откуда-то и чуть-чуть изменён
zsh 4.3.6 (i686-pc-linux-gnu)
$ echo -e "#include \n\nusing namespace std;\n\nint main() {\n\treturn 0;\n}" > /tmp/file
$ cat /tmp/file
#include
using namespace std;
int main() {
return 0;
}
$
конфиг, стырен откуда-то и чуть-чуть изменён
Не нашёл в твоём конфиге ничего, что могло бы повлиять и чего я ещё не пробовал :(
Добавил ссылку на свой .zshrc в пост.
Добавил ссылку на свой .zshrc в пост.
echo "some code with \n, \t etc"
а тут разве не надо экранировать символы "\"?
Действительно, такой код:
echo "#include <iostream>\\n\\nusing namespace std;\\n\\nint main() {\\n\\treturn 0;\\n}"
отработал на «ура». Но я искренне не понимаю, почему так. Разве их надо экранировать? Почему в bash'е всё работает и так? Какая опция установлена у меня и не установлена у muhas'а (или наоборот), из-за которой поведение echo различается? Или это всё-таки из-за версии?
голова с утра не варит, вообще символ экранирования - /
другое дело почему не работает скрипт так же как и в баше. Я полагаю, что zsh и не должен быть совместим с башем, у него свои правила обработки команд, просто они во многом похожи на шелловские.
другое дело почему не работает скрипт так же как и в баше. Я полагаю, что zsh и не должен быть совместим с башем, у него свои правила обработки команд, просто они во многом похожи на шелловские.
вообще символ экранирования - /
O_OС каких это пор?
Про скрипт совершенно ничего не понял. Я об интерактивном режиме говорю. Впрочем, в скриптах всё работает на ура.
Конфиг zsh в студию, тогда можно будет выяснять.
zsh 4.3.10 (x86_64-unknown-linux-gnu) отрабатывает Ваши строчки без проблем.
zsh 4.3.10 (x86_64-unknown-linux-gnu) отрабатывает Ваши строчки без проблем.
Гугл какбе помогаэ нам и даёт ссылко
Как я понял, Вам должно помочь
Как я понял, Вам должно помочь
unsetopt BSD_ECHO
тогда даже не представляю... видимо точно в версии - хотя сколько помню себя zsh работал у меня так же как и сейчас (по меньшей мере ветка 4.3 в archlinux)
echo "some code with \n, \etc"
some code with
, etc
zsh 4.3.10
не понял, в чем проблема?
echo "#include <iostream>\n\nusing namespace std;\n\nint main() {\n\treturn 0;\n}"
#include <iostream>
using namespace std;
int main() {
return 0;
}
и соответсвенно перенаправление в stderr не валится
мой конфиг ты видел, посмотри те переменные что установлены