|  | 
| 
Помогите понять как работает баш-скрипт | |||
|---|---|---|---|
| #18+ Добрый день, потихоньку изучаю linux. Есть вот такой скрипт (send_email.sh), который нестабильно работает: Код: coco 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. При запуске: Код: sql 1. Выдает ошибку: Код: sql 1. Разбираю скрипт по-строчно: #!/bin/sh это показывает где баш SUBJ="$1" присвоение переменной SUBJ входного параметра номер 1 MAILTO="user3401@pochta.ru" присвоение переменной MAILTO значения "user3401@pochta.ru" FROM="monitor@mail.ru" присвоение переменной FROMзначения "monitor@mail.ru" [ ! -z $1 ] && IN=$(cat $1) || IN=$(cat - ) Это непонятно, по порядку [ ! -z $1 ] - если параметр 1 не пустой && - и IN=$(cat $1) -непонятно || - или IN=$(cat - ) - непонятно /usr/sbin/sendmail -t << EOF запуск /usr/sbin/sendmail с параметром -t и чем-то непонятным (EOF) To: $MAILTO From: $FROM Subject: $SUBJ $IN тут наверное формируется какой-то текст для передачи в /usr/sbin/sendmail, Помогите пожалуйста понять что значит это: IN=$(cat $1) || IN=$(cat - ) EOF, как я понял, это создание текста, который потом подается на вход /usr/sbin/sendmail ... | |||
| : 
 Нравится:
     Не нравится:
     | |||
| 02.10.2018, 16:29 |  | ||
| 
Помогите понять как работает баш-скрипт | |||
|---|---|---|---|
| #18+ qqq_2  Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Пытается выполнить отмеченную команду, не находит такой файл и отваливается ... | |||
| : 
 Нравится:
     Не нравится:
     | |||
| 02.10.2018, 17:27 |  | ||
| 
Помогите понять как работает баш-скрипт | |||
|---|---|---|---|
| #18+ Vadim Lejninqqq_2  Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Пытается выполнить отмеченную команду, не находит такой файл и отваливается Спасибо :) Правильно ли я понял что тут он пытается переменной IN присвоить значение выполнения команды cat файла, который в переменной $1 ? ... | |||
| : 
 Нравится:
     Не нравится:
     | |||
| 02.10.2018, 17:35 |  | ||
| 
Помогите понять как работает баш-скрипт | |||
|---|---|---|---|
| #18+ qqq_2, Да все верно, варианты этой команды: Код: sql 1. 2. смотрим дальше: Видим конвеер команд: тут нужно понимать следующее Код: plaintext Код: plaintext То есть конструкция Код: sql 1. читается так: если cmd1 вернула 0 (то есть завершилась удачно), то выполнить cmd2 если cmd1 вернула ошибку, выполнение конвеера прервать: конструкция Код: sql 1. читается так: если cmd1 вернула 0 (то есть завершилась удачно), то cmd2 не выполнять если cmd1 вернула ошибку, то выполнить cmd2 Примеры: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. теперь конструкция << формат такой: Код: sql 1. 2. 3. 4. 5. то есть в Вашем случае, STRING_INPUT_TERMINATOR - это строка EOF Код: sql 1. 2. 3. 4. ... | |||
| : 
 Нравится:
     Не нравится:
     | |||
| 02.10.2018, 18:02 |  | ||
| 
Помогите понять как работает баш-скрипт | |||
|---|---|---|---|
| #18+ Vadim Lejninесли cmd1 вернула 0 (то есть завершилась удачно), то cmd2 не выполнять если cmd1 вернула ошибку, то выполнить cmd2 То есть в данном случае если cat из файла обломился, то читать в IN из стандартного ввода. Вылазящее же при этом сообщение об ошибке вполне ожидаемо и его просто забыли подавить. Или в проверку забыли добавить условие существования читаемого файла. Posted via ActualForum NNTP Server 1.5 ... | |||
| : 
 Нравится:
     Не нравится:
     | |||
| 02.10.2018, 18:10 |  | ||
| 
Помогите понять как работает баш-скрипт | |||
|---|---|---|---|
| #18+ В отличии от windows метасимволы в unix подменяются shell а не командой Поэтому: Код: sql 1. 2. 3. 4. 5. 6. 7. Для отладки я часто использую следующий фокус: Код: sql 1. 2. 3. 4. 5. 6. 7. Достаточно раскомментировать T=echo и увидишь команды + некоторые команды set Код: sql 1. 2. 3. 4. 5. 6. ... | |||
| : 
 Нравится:
     Не нравится:
     | |||
| 02.10.2018, 18:13 |  | ||
| 
Помогите понять как работает баш-скрипт | |||
|---|---|---|---|
| #18+ Vadim Lejninqqq_2, Да все верно, варианты этой команды: Код: sql 1. 2. смотрим дальше: Видим конвеер команд: тут нужно понимать следующее Код: plaintext Код: plaintext То есть конструкция Код: sql 1. читается так: если cmd1 вернула 0 (то есть завершилась удачно), то выполнить cmd2 если cmd1 вернула ошибку, выполнение конвеера прервать: конструкция Код: sql 1. читается так: если cmd1 вернула 0 (то есть завершилась удачно), то cmd2 не выполнять если cmd1 вернула ошибку, то выполнить cmd2 Примеры: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. теперь конструкция << формат такой: Код: sql 1. 2. 3. 4. 5. то есть в Вашем случае, STRING_INPUT_TERMINATOR - это строка EOF Код: sql 1. 2. 3. 4. Теперь вроде все стало понятно и на свох места. Пока впитываю информацию. Благодарю за такой подробный ответ, Вадим! ;) ... | |||
| : 
 Нравится:
     Не нравится:
     | |||
| 02.10.2018, 18:23 |  | ||
| 
Помогите понять как работает баш-скрипт | |||
|---|---|---|---|
| #18+ Vadim Lejnin, Ктсати, поэкспериментировал, получилось что cat - выводит то, что ему идет на вход. Получается что пременной IN присваивается то что пришло на вход send_email.sh ... | |||
| : 
 Нравится:
     Не нравится:
     | |||
| 02.10.2018, 18:30 |  | ||
| 
Помогите понять как работает баш-скрипт | |||
|---|---|---|---|
| #18+ qqq_2Vadim Lejnin, Ктсати, поэкспериментировал, получилось что cat - выводит то, что ему идет на вход. Получается что пременной IN присваивается то что пришло на вход send_email.sh Да все верно, часто символ "-" используется как STDIN ... | |||
| : 
 Нравится:
     Не нравится:
     | |||
| 02.10.2018, 18:43 |  | ||
|  | 

| start [/forum/search_topic.php?author=Alissa&author_mode=last_topics&do_search=1]: | 0ms | 
| get settings: | 8ms | 
| get forum list: | 10ms | 
| get settings: | 11ms | 
| get forum list: | 13ms | 
| check forum access: | 3ms | 
| check topic access: | 3ms | 
| track hit: | 40ms | 
| get topic data: | 13ms | 
| get forum data: | 3ms | 
| get page messages: | 47ms | 
| get tp. blocked users: | 2ms | 
| others: | 1713ms | 
| total: | 1866ms | 

| 0 / 0 | 
