powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / Помогите понять как работает баш-скрипт
9 сообщений из 9, страница 1 из 1
Помогите понять как работает баш-скрипт
    #39711821
qqq_2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, потихоньку изучаю linux.

Есть вот такой скрипт (send_email.sh), который нестабильно работает:


Код: coco
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
#!/bin/sh
SUBJ="$1"
MAILTO="user3401@pochta.ru"
FROM="monitor@mail.ru"
[ ! -z $1 ] && IN=$(cat $1) || IN=$(cat - )
/usr/sbin/sendmail -t << EOF
To: $MAILTO
From: $FROM
Subject: $SUBJ

$IN



При запуске:
Код: sql
1.
echo 'test_leter' |./send_email.sh test_subject


Выдает ошибку:
Код: sql
1.
cat: test_subject: No such file or directory





Разбираю скрипт по-строчно:





#!/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
...
Рейтинг: 0 / 0
Помогите понять как работает баш-скрипт
    #39711866
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qqq_2
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
#!/bin/sh
SUBJ="$1"
MAILTO="user3401@pochta.ru"
FROM="monitor@mail.ru"
[ ! -z $1 ] && IN=$(cat $1) || IN=$(cat - )
/usr/sbin/sendmail -t << EOF
To: $MAILTO
From: $FROM
Subject: $SUBJ

$IN




Пытается выполнить отмеченную команду, не находит такой файл и отваливается
...
Рейтинг: 0 / 0
Помогите понять как работает баш-скрипт
    #39711873
qqq_2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim Lejninqqq_2
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
#!/bin/sh
SUBJ="$1"
MAILTO="user3401@pochta.ru"
FROM="monitor@mail.ru"
[ ! -z $1 ] && IN=$(cat $1) || IN=$(cat - )
/usr/sbin/sendmail -t << EOF
To: $MAILTO
From: $FROM
Subject: $SUBJ

$IN




Пытается выполнить отмеченную команду, не находит такой файл и отваливается

Спасибо :)

Правильно ли я понял что тут он пытается переменной IN присвоить значение выполнения команды cat файла, который в переменной $1 ?
...
Рейтинг: 0 / 0
Помогите понять как работает баш-скрипт
    #39711903
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qqq_2,

Да все верно, варианты этой команды:

Код: sql
1.
2.
HI=`echo Hi`
HI=$(echo hi)



смотрим дальше:
Видим конвеер команд:

тут нужно понимать следующее
Код: plaintext
&&
и
Код: plaintext
||
- это не логические операторы (хотя можно и так интерпретировать), а условные операторы выполнения.
То есть конструкция
Код: sql
1.
cmd1 && cmd2 


читается так:
если cmd1 вернула 0 (то есть завершилась удачно), то выполнить cmd2
если cmd1 вернула ошибку, выполнение конвеера прервать:

конструкция
Код: sql
1.
cmd1 || cmd2 


читается так:
если cmd1 вернула 0 (то есть завершилась удачно), то cmd2 не выполнять
если cmd1 вернула ошибку, то выполнить cmd2

Примеры:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
$ (echo cmd1;true) && (echo cmd2;true)
cmd1
cmd2

$ (echo cmd1;false) && (echo cmd2;true)
cmd1

$ (echo cmd1;false) && (echo cmd2;true)
cmd1

$ (echo cmd1;false) || (echo cmd2;true)
cmd1
cmd2

$ (echo cmd1;true) || (echo cmd2;true)
cmd1




теперь конструкция <<

формат такой:

Код: sql
1.
2.
3.
4.
5.
cmd << STRING_INPUT_TERMINATOR
...
any text
...
STRING_INPUT_TERMINATOR



то есть в Вашем случае, STRING_INPUT_TERMINATOR - это строка EOF
Код: sql
1.
2.
3.
4.
/usr/sbin/sendmail -t << EOF

text
EOF
...
Рейтинг: 0 / 0
Помогите понять как работает баш-скрипт
    #39711912
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim Lejninесли cmd1 вернула 0 (то есть завершилась удачно), то cmd2 не выполнять
если cmd1 вернула ошибку, то выполнить cmd2

То есть в данном случае если cat из файла обломился, то читать в IN из стандартного ввода.
Вылазящее же при этом сообщение об ошибке вполне ожидаемо и его просто забыли подавить.
Или в проверку забыли добавить условие существования читаемого файла.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите понять как работает баш-скрипт
    #39711914
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В отличии от windows метасимволы в unix подменяются shell а не командой
Поэтому:
Код: sql
1.
2.
3.
4.
5.
6.
7.
$ touch 1.txt 2.txt 3.txt
$ ls *.txt
1.txt  2.txt  3.txt
$ echo mv *.txt *.doc
mv 1.txt 2.txt 3.txt *.doc
$  mv *.txt *.doc
mv: *.doc not found


Для отладки я часто использую следующий фокус:

Код: sql
1.
2.
3.
4.
5.
6.
7.
#!/bin/bash
unset T
#T=echo
# set -vx

$T cmd1 $VAR $VAR2 ....
$T cmd2 $VAR $VAR2 ....



Достаточно раскомментировать T=echo и увидишь команды

+ некоторые команды set

Код: sql
1.
2.
3.
4.
5.
6.
set -a  # turn on auto export variable
set +a # turn off auto export variable
set -v  # on эхо выполняемых команд
set +v  #off  эхо выполняемых команд
set -x  # on вывод команд после всех подстановок перед выполнением
set +x  #off вывод команд после всех подстановок перед выполнением
...
Рейтинг: 0 / 0
Помогите понять как работает баш-скрипт
    #39711924
qqq_2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim Lejninqqq_2,

Да все верно, варианты этой команды:

Код: sql
1.
2.
HI=`echo Hi`
HI=$(echo hi)



смотрим дальше:
Видим конвеер команд:

тут нужно понимать следующее
Код: plaintext
&&
и
Код: plaintext
||
- это не логические операторы (хотя можно и так интерпретировать), а условные операторы выполнения.
То есть конструкция
Код: sql
1.
cmd1 && cmd2 


читается так:
если cmd1 вернула 0 (то есть завершилась удачно), то выполнить cmd2
если cmd1 вернула ошибку, выполнение конвеера прервать:

конструкция
Код: sql
1.
cmd1 || cmd2 


читается так:
если cmd1 вернула 0 (то есть завершилась удачно), то cmd2 не выполнять
если cmd1 вернула ошибку, то выполнить cmd2

Примеры:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
$ (echo cmd1;true) && (echo cmd2;true)
cmd1
cmd2

$ (echo cmd1;false) && (echo cmd2;true)
cmd1

$ (echo cmd1;false) && (echo cmd2;true)
cmd1

$ (echo cmd1;false) || (echo cmd2;true)
cmd1
cmd2

$ (echo cmd1;true) || (echo cmd2;true)
cmd1




теперь конструкция <<

формат такой:

Код: sql
1.
2.
3.
4.
5.
cmd << STRING_INPUT_TERMINATOR
...
any text
...
STRING_INPUT_TERMINATOR



то есть в Вашем случае, STRING_INPUT_TERMINATOR - это строка EOF
Код: sql
1.
2.
3.
4.
/usr/sbin/sendmail -t << EOF

text
EOF




Теперь вроде все стало понятно и на свох места.

Пока впитываю информацию.


Благодарю за такой подробный ответ, Вадим! ;)
...
Рейтинг: 0 / 0
Помогите понять как работает баш-скрипт
    #39711934
qqq_2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim Lejnin,

Ктсати, поэкспериментировал, получилось что

cat -

выводит то, что ему идет на вход.


Получается что пременной IN присваивается то что пришло на вход send_email.sh
...
Рейтинг: 0 / 0
Помогите понять как работает баш-скрипт
    #39711956
Фотография Vadim Lejnin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qqq_2Vadim Lejnin,

Ктсати, поэкспериментировал, получилось что

cat -

выводит то, что ему идет на вход.


Получается что пременной IN присваивается то что пришло на вход send_email.sh

Да все верно, часто символ "-" используется как STDIN
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / Помогите понять как работает баш-скрипт
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]