Видео ролики бесплатно онлайн

Смотреть жесткий видео

Официальный сайт detisavve 24/7/365

Смотреть видео бесплатно

Minoru 18.03.2010 01:29

Есть вопрос![Решено] ZSH и echo

В бытность свою bash-юзером приучил меня один хороший человек по-быстрому всякие вещи проверять конструкциями типа:
1
echo "some code with \n, \t etc" > file && doing something with file && rm file

или даже
1
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 делает именно то, что я хочу:
1
2
3
4
5
6
7
8
9
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:
1
2
3
4
5
6
7
8
9
% 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, с помощью которой я устанавливал заголовок окна терминала:
1
2
3
preexec() {
print -Pn "\e]0;`echo $1 | sed -r 's/^(sudo [^[:space:]]+|[^[:space:]]+).*/\1/'`\a"
}

Стоило немного её поправить, и всё заработало правильно:
1
2
3
preexec() {
print -Pn "\e]0;`echo $1 | head -n1 | sed -r 's/^(sudo [^[:space:]]+|[^[:space:]]+).*/\1/'`\a"
}



Тэги:
+ 0 -
Похожие Поделиться

muhas 18.03.2010 09:41 #
+ 0 -
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 не валится

мой конфиг ты видел, посмотри те переменные что установлены
Minoru 18.03.2010 09:57 #
+ 0 -
Закомментировал в своём конфе всё, что могло повлиять на ситуацию (set BRACECCL), выдернул из твоего те части, что могли бы помочь — ноль эффекта, все равно та же фигня :(

Может, это из-за версии? У меня zsh 4.3.6 (x86_64-unknown-linux-gnu)
muhas 18.03.2010 11:13 #
+ 0 -
Additionally the BSD_ECHO and IGNORE_BRACES options are set if zsh is invoked as sh
может быть поможет быть ^_^

попробуй кстати /bin/echo
Minoru 18.03.2010 12:51 #
+ 0 -
Пытался делать unset указанных опций — никак не влияет. Аналогично, если делал set.

Если использовать /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;
}
%
xT 18.03.2010 14:45 #
+ 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;
}
$


конфиг, стырен откуда-то и чуть-чуть изменён
Minoru 18.03.2010 17:18 #
+ 0 -
Не нашёл в твоём конфиге ничего, что могло бы повлиять и чего я ещё не пробовал :(

Добавил ссылку на свой .zshrc в пост.
muhas 18.03.2010 09:42 #
+ 0 -
echo "some code with \n, \t etc" конечнь, а то t куда-то съелось
s2h 18.03.2010 11:00 #
+ 0 -
echo "some code with \n, \t etc"
а тут разве не надо экранировать символы "\"?
s2h 18.03.2010 11:00 #
+ 0 -
\ - парсер съел
Minoru 18.03.2010 11:06 #
+ 0 -
Действительно, такой код:
echo "#include <iostream>\\n\\nusing namespace std;\\n\\nint main() {\\n\\treturn 0;\\n}"отработал на «ура». Но я искренне не понимаю, почему так. Разве их надо экранировать? Почему в bash'е всё работает и так? Какая опция установлена у меня и не установлена у muhas'а (или наоборот), из-за которой поведение echo различается? Или это всё-таки из-за версии?
s2h 18.03.2010 11:30 #
+ 0 -
голова с утра не варит, вообще символ экранирования - /
другое дело почему не работает скрипт так же как и в баше. Я полагаю, что zsh и не должен быть совместим с башем, у него свои правила обработки команд, просто они во многом похожи на шелловские.
Minoru 18.03.2010 12:55 #
+ 0 -
вообще символ экранирования - /
O_O
С каких это пор?

Про скрипт совершенно ничего не понял. Я об интерактивном режиме говорю. Впрочем, в скриптах всё работает на ура.
s2h 18.03.2010 11:32 #
+ 0 -
тем более интерпретатор ты указываешь в #!/bin/zsh
albibek 18.03.2010 13:19 #
+ 1 -
Конфиг zsh в студию, тогда можно будет выяснять.
zsh 4.3.10 (x86_64-unknown-linux-gnu) отрабатывает Ваши строчки без проблем.
Minoru 18.03.2010 17:17 #
+ 0 -
Упс… #cmnt45811 — тебе
albibek 24.03.2010 16:41 #
+ 0 -
Гугл какбе помогаэ нам и даёт ссылко

Как я понял, Вам должно помочь

unsetopt BSD_ECHO
Minoru 18.03.2010 17:16 #
+ 0 -
.zshrc
muhas 20.03.2010 12:23 #
+ 0 -
попробуйка source /etc/profile в начале rc файла
Minoru 22.03.2010 18:39 #
+ 0 -
Без толку :(
muhas 23.03.2010 09:35 #
+ 0 -
тогда даже не представляю... видимо точно в версии - хотя сколько помню себя zsh работал у меня так же как и сейчас (по меньшей мере ветка 4.3 в archlinux)
Minoru 13.01.2011 18:05 #
+ 0 -
Как говорится, не прошло и года… Проблема успешно решена! Кому интересно, те могут почитать мой псто.

Смотреть онлайн бесплатно

Онлайн видео бесплатно


Смотреть русское с разговорами видео

Online video HD

Видео скачать на телефон

Русские фильмы бесплатно

Full HD video online

Смотреть видео онлайн

Смотреть HD видео бесплатно

School смотреть онлайн