Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » UNIX » Чудеса UNIX синтаксиса: bash шелл - вопросы

Модерирует : ShriEkeR

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

alex5161



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Вроде не новичек в Юниксе, а сегодня встретил непонятное, стал искать - еще больше чудес увидел, так и не выяснив что искал. Поясните что и как в этих примерах происходит, please!
 
 Начал с того, что встретил '\' перед командой, и, проверив, увидел что Юникс не имеет ничего против и выполняет команду без проблем.  
Вот примеры:
bash-2.03$> \rm garb
 # файл garb удален
bash-2.03$> \rm garb
garb: No such file or directory
bash-2.03$> rm garb
garb: No such file or directory
 # никакой внешней разницы не вижу  
 
 Так же и с другими командами, как cp, echo.
 Но ведь если не ругается, значит что-то он делает?!
 
 Так вот, стал искать такое неблагодарное дело, как '\' и встретил другое чюдо. Обрадовался, интересно, стал пробовать, оказалось ничего не понятно!
 Пример такой:

Цитата:
 
A command may act upon a comma-separated list of file specs within braces. [2] Filename expansion (globbing) applies to the file specs between the braces.
 
 No spaces allowed within the braces unless the spaces are quoted or escaped.
 
echo {file1,file2}\ :{\ A," B",' C'}
file1 : A file1 : B file1 : C file2 : A file2 : B file2 : C
 

 
 А вот мои попытки:  
bash-2.03$> echo {here, there} { a, "A", "B"}       # 1    
{here, there} { a, A, B}                                  
bash-2.03$> echo {here, there}\ { a, "A", "B"}      # 2
{here, there} { a, A, B}
bash-2.03$> echo {here, there}\ {\ a, "A", "B"}     # 3
{here, there} { a, A, B}
bash-2.03$> echo {here, there}{"a", "A", "B"}       # 4
{here, there}{a, A, B}
bash-2.03$> echo {here,there}\ :{\ "a", "A", "B"}   # 5
here :{ a, there :{ a, A, B}
bash-2.03$> echo {here,there}\ :{\ a," A",' B'}       # 6
here : a here : A here : B there : a there : A there : B
 
 
 Интересная находка, то, что каждый элемент одного набора отрабатывается командой с кадым элементом второго набора.  
 Но не так элементарно, оказывается!
 В первой и второй попытке не происходит вообше ничего.
 Думал пробелы отключают такую отработку, как в  оригинальном примере, но 3 и 4 пример не дал опять ничего.
 Что-то начало проявлятся в пятом, но по каким правилам, не пойму
 А точное копирование работает!
 Чувствую себя табуретом без малейшего намека на извилины!
 
 Поясните, что же за правила здесь работают и как их правильно применять?
 Буду бладогарен!
 
 

Всего записей: 1446 | Зарегистр. 26-03-2002 | Отправлено: 20:53 26-05-2006 | Исправлено: alex5161, 21:20 26-05-2006
kozandr

Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
\ - является экранирующим символом. он ставится перед зарезервированными служебными символами и экранируют их, при этом не оказывает влияния на обыкновенные символы.
поэтому \ перед командой не делает  ничего, но зато \ перед пробелом экранирует пробел, и шелл не интерпритирует пробел как разделитель между параметрами к команде.
пример:

Код:
bash-3.00$ cat hgfgdf\ dffsd
34343
bash-3.00$ cat "hgfgdf dffsd"
34343

 
 
 
 
Добавлено:
bash-2.03$> echo {here, there} { a, "A", "B"}       # 1  
{here, there} { a, A, B}                                    
 
не работает, потому что шелл не понимает, что ему делать. нарушен синтаксис.
пробелы и пропушено двоеточие.
 
bash-2.03$> echo {here, there}\ { a, "A", "B"}      # 2  
{here, there} { a, A, B}  
 
аналогично, пробелы, нет двоеточия
 
bash-2.03$> echo {here, there}\ {\ a, "A", "B"}     # 3  
{here, there} { a, A, B}  
 
двоеточие
 
bash-2.03$> echo {here, there}{"a", "A", "B"}       # 4  
{here, there}{a, A, B}  
 
двоеточие...
 
bash-2.03$> echo {here,there}\ :{\ "a", "A", "B"}   # 5  
here :{ a, there :{ a, A, B}  
bash-2.03$> echo {here,there}\ :{\ a," A",' B'}       # 6  
here : a here : A here : B there : a there : A there : B
 
 
и вообще не совсем понятно.. чего ты собирался добиться, используя неправильный синтаксис?

Всего записей: 507 | Зарегистр. 06-05-2005 | Отправлено: 12:34 27-05-2006
alex5161



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
kozandr - Спапсибо за пояснения.  
 Т.е по-поводу '\' : о том, что он экраннирует или отменяет интерпретирование специальных символов (пробел в том числе), мне знакомо. Но ты имеешь в виду, что именно это является причиной того, что в моем примере шелл не ругаается на него, но не имея после него никакого специального символа, просто ничего не делает.
 Я правильно понял?
 
 Вообще ты напрасно на меня так наежаешь:
Цитата:
и вообще не совсем понятно.. чего ты собирался добиться, используя неправильный синтаксис?  
- Я не выкаблучивался, я пытался понять. Я нашел цитированое высказывание поиском в некоемом учебнике по символу '\'.
 Данный раздел был как раз о специальных символах, и в данном месте толковали об экранировании пробела. Поэтому я и не имею понятия  что это за синтасксис {}:{}.  
 С твоих пояснений я понял, что ':' является частью синтаксиса (что не само собой, так как ':' появляется в результирующей строке)
 Хотелось бы узнать в каком разделе описание {}:{} можно было бы ппочитать Т.е. к чему это вообще относится.
 
 Еще раз спасибо за ответ. Хот ты меня и не совсем понал, но пояснил и прояснил. Благодарен!
 
 
 

Всего записей: 1446 | Зарегистр. 26-03-2002 | Отправлено: 21:00 28-05-2006
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Операционные системы » UNIX » Чудеса UNIX синтаксиса: bash шелл - вопросы


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru