Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Защищенный блок в bash-скрипте  (Прочитано 2431 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн RustemNur

  • Автор темы
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 2939
  • умрешь с вами
    • Просмотр профиля
Защищенный блок в bash-скрипте
« : 25 Июня 2010, 09:17:23 »
Скажите пожалуйста, возможно ли "защитить" некую последовательность команд в bash-скрипте (или хотя бы одну команду)?
По типу Паскалевского try ... except или Сишного try ... catch (вроде бы - на С не писал).
Смотрел на trap, но не понял, оно ли это.
Спасибо.

Оффлайн truegeek

  • FPGA Designer
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 4214
  • аЦкий схемотехник
    • Просмотр профиля
Re: Защищенный блок в bash-скрипте
« Ответ #1 : 25 Июня 2010, 09:34:30 »
что значит защитить?
try - except это же обработчик исключений/ошибок

аналога в баш нет, нужно добавлять различные условия
« Последнее редактирование: 25 Июня 2010, 09:38:39 от Владимир Николаевич »

Оффлайн RustemNur

  • Автор темы
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 2939
  • умрешь с вами
    • Просмотр профиля
Re: Защищенный блок в bash-скрипте
« Ответ #2 : 25 Июня 2010, 09:51:06 »
что значит защитить?

Не дать скипту "вывалиться" (закончиться), а отреагировать нужным мне образом. В простейшем случае просто игнорировать ошибки (скажем, ввода/вывода) и продолжить выполнение со следующей команды.

try - except это же обработчик исключений/ошибок

Именно так. В простейшем случае
try
(опасный оператор)
except end
т.е. без обработчика исключения, просто тихо-мирно переходит к следующему оператору.

аналога в баш нет, нужно добавлять различные условия

Ээхх...
« Последнее редактирование: 25 Июня 2010, 10:54:58 от RustemNur »

Оффлайн truegeek

  • FPGA Designer
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 4214
  • аЦкий схемотехник
    • Просмотр профиля
Re: Защищенный блок в bash-скрипте
« Ответ #3 : 25 Июня 2010, 10:40:33 »
дык а в чем собственно проблема то? можно обходится и без обработчика исключений

кстати вот
http://linuxgazette.net/109/park.html

искать по слову try
автор реализовал в баше обработчик ошибок

но мое личное мнение, лучше использовать python....
« Последнее редактирование: 25 Июня 2010, 10:51:03 от Владимир Николаевич »

Оффлайн RustemNur

  • Автор темы
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 2939
  • умрешь с вами
    • Просмотр профиля
Re: Защищенный блок в bash-скрипте
« Ответ #4 : 25 Июня 2010, 11:17:37 »
кстати вот
http://linuxgazette.net/109/park.html
автор реализовал в баше обработчик ошибок

Спасибо за ссылку.
Это костыль, который только у него (у меня) и будет работать. До поры, до времени.

но мое личное мнение, лучше использовать python....

Думаю про него.
Хотел вообще-то на Лазаря "залезть".
Не решил еще.
Скрипты, конечно, это не проги, чтобы бинарники компилить, пусть даже и консольные. Придется, видимо, питоном заниматься.

ЗЫ: как корежит-то после многих лет паскаля от синтаксисов типа bash-а.... И regexp-а...

Оффлайн truegeek

  • FPGA Designer
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 4214
  • аЦкий схемотехник
    • Просмотр профиля
Re: Защищенный блок в bash-скрипте
« Ответ #5 : 25 Июня 2010, 11:21:49 »
баш и не предназначен для того, чтобы писать программы... исключительно скрипты, костыли и тому подобные штуки ;)

синтаксис? что качается этого, то программирование на питоне вам должно понравится, синтаксис там жесткий... и это очень хорошо

Оффлайн Lion-Simba

  • Старожил
  • *
  • Сообщений: 1126
    • Просмотр профиля
Re: Защищенный блок в bash-скрипте
« Ответ #6 : 25 Июня 2010, 12:01:23 »
Именно так. В простейшем случае
try
(опасный оператор)
except end
т.е. без обработчика исключения, просто тихо-мирно переходит к следующему оператору.

Так ведь баш так и работает по умолчанию.
#!/bin/bash

echo "123"
cat /non-existent/file
echo "456"

выведет:
123
cat: /non-existent/file: Нет такого файла или каталога
456
Оказываю индивидуальную платную техподдержку широкого профиля. Обращаться в ЛС или Jabber.

Оффлайн RustemNur

  • Автор темы
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 2939
  • умрешь с вами
    • Просмотр профиля
Re: Защищенный блок в bash-скрипте
« Ответ #7 : 25 Июня 2010, 12:53:02 »
Так ведь баш так и работает по умолчанию.
#!/bin/bash

echo "123"
cat /non-existent/file
echo "456"

Че-то у меня ошибка с rsync в скрипте (нарвавшись на какой-то файл, недоступный из-за лока на виндовс-машине) приводит к прерыванию скрипта. :(

Оффлайн Lion-Simba

  • Старожил
  • *
  • Сообщений: 1126
    • Просмотр профиля
Re: Защищенный блок в bash-скрипте
« Ответ #8 : 25 Июня 2010, 13:04:14 »
Че-то у меня ошибка с rsync в скрипте (нарвавшись на какой-то файл, недоступный из-за лока на виндовс-машине) приводит к прерыванию скрипта. :(
Покажите чтоли скрипт.
Оказываю индивидуальную платную техподдержку широкого профиля. Обращаться в ЛС или Jabber.

Оффлайн aliftin

  • Старожил
  • *
  • Сообщений: 1398
    • Просмотр профиля
Re: Защищенный блок в bash-скрипте
« Ответ #9 : 25 Июня 2010, 13:07:52 »
А предвидеть отсутствие файла не получается? То есть что бы при отсутствие файла прерывание работы не происходило и выполнялась другая функция/продолжалась эта.
Если мы не можем до чего то дотянуться, мы виним в этом не свой рост, не отсутствие табуретки, а свою цель.

Оффлайн RustemNur

  • Автор темы
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 2939
  • умрешь с вами
    • Просмотр профиля
Re: Защищенный блок в bash-скрипте
« Ответ #10 : 25 Июня 2010, 13:43:23 »
Покажите чтоли скрипт.

Эттаа... Про учесть... Паскаль и все такое ... Писал сам.

#!/bin/bash -e
# скрипт резевного копирования домашних каталогов всех указанных хостов, а так же общей папки xls на локальном винчестере и баз 1С на одной из Windows-машин
# запускается от root (из cron)
# скрипт подсоединятеся по ssh к машинам в сети, которые он смог пропинговать, и зеркалирует папку /home (для Linux-машин) и User(для Windows-машин)
# для преодоления проблемы запроса пароля при логине авторизация реализована по ключам (для Linux)
# для работы с Windows-машинами на них установлен DeltaCopy
#
# для вывода на экран в процессе работы запускать с параметром 1
v=''
if [ $1 -eq 1 ]; then v='-h --progress' ; fi
# хосты (сетевые имена), требующие резервного копирования
# Linix
hostsnames[0]='iskander-desktop'
hostsnames[1]='irina-desktop'
hostsnames[2]='kozionov-desktop'
hostsnames[3]='ravil-desktop'
hostsnames[4]='gulnaz-desktop'
hostsnames[5]='ns1'
hostsnames[6]='camera-pictures'
hostsnames[7]='artem-dt-old'
hostsnames[8]='www'
# Windows
hostsnames[9]='vladimir'
hostsnames[10]='aelita'
hostsnames[11]='rustem'
hostsnames[12]='artem-xp'
hostsnames[13]='gazizan-desktop'

# хост является Linux (1)- или Windows (0)-машиной. Индексы соответстуют массиву hostsnames. Имитация многомерного массива
linuxhost[0]=1
linuxhost[1]=1
linuxhost[2]=1
linuxhost[3]=1
linuxhost[4]=1
linuxhost[5]=1
linuxhost[6]=1
linuxhost[7]=1
linuxhost[8]=1
linuxhost[9]=0
linuxhost[10]=0
linuxhost[11]=0
linuxhost[12]=0
linuxhost[13]=0

# размер массива
ar_dim=${#hostsnames[@]}

# дата следующего пробуждения хостов для бакапа
#wake_data=$(date '+%s' -d ' + 1 day'02:05)

# файл лога
log='/var/log/rsync.log'
echo $(date)>>$log
# копируем самый главный каталог на локальном винчестере - xls
echo 'копирование папки xls'>>$log
rsync $v -rztplog  --exclude-from=/home/rust/rsync_exclude --delete --log-file=$log /media/xls/ /media/backup/rsync/xls
# копируем домашний каталог на локальном винчестере
echo 'копирование домашнего каталога сервера'>>$log
if [ $1 -eq 1 ]; then echo 'копирование домашнего каталога сервера' ; fi
rsync $v -rztplog  --exclude-from=/home/rust/rsync_exclude --delete --log-file=$log /home /media/backup/rsync/server

# цикл по всем хостам с проверкой доступности (через ping)
full_c=0
c=0
# имена ответивших на ping хостов заносим в массив livehosts
while [ $full_c -lt $ar_dim ]
do
 if eval "ping -c 1 ${hostsnames[full_c]}>/dev/null" ; then
  livehosts[$c]=${hostsnames[full_c]}
  livelinux[$c]=${linuxhost[full_c]}
  let "c+=1"
 fi
 let "full_c+=1"
done
work_c=0
echo 'копирование с подключенных хостов'>>$log
if [ $1 -eq 1 ]; then echo 'копирование с подключенных хостов' ; fi
# цикл резевного копирования по ответившим хостам
while [ ! $work_c -eq $c ]
do
 echo "хост ${livehosts[$work_c]}">>$log
 if [ $1 -eq 1 ]; then echo "хост ${livehosts[$work_c]}" ; fi
 if [ ${livelinux[$work_c]} -eq 1 ]; then # бакапим Linux-машину
  rsync $v -rztplog  --exclude-from=/home/rust/rsync_exclude --delete --log-file=$log ${livehosts[$work_c]}:/home :/etc /media/backup/rsync/${livehosts[$work_c]}
  # переустанавливаем "будильник" и выключаем хост
  if [ ${livehosts[$work_c]} = 'www' ]; then  let "work_c+=1"; continue; fi # там старое ядро
  ssh ${livehosts[$work_c]} "echo 0 > /sys/class/rtc/rtc0/wakealarm"
  ssh ${livehosts[$work_c]} "echo `date '+%s' -d ' + 1 day'02:15` > /sys/class/rtc/rtc0/wakealarm"
  if ! eval "cat livehosts|grep ${livehosts[$work_c]}>/dev/null"; then ssh ${livehosts[$work_c]} poweroff; fi

 fi
 if [ ${livelinux[$work_c]} -eq 0 ]; then # бакапим Windows-машину
  rsync $v -rztplog --exclude-from=/home/rust/rsync_exclude --delete --log-file=$log --iconv=utf8 ${livehosts[$work_c]}::User/ /media/backup/rsync/${livehosts[$work_c]}/User
  # особая машина; копируем 1С
  if [ ${livehosts["$work_c"]}="vladimir" ]; then # тут базы 1С
   echo '1C'>>$log
   rsync $v -rztplog --exclude-from=/home/rust/rsync_exclude --delete --log-file=$log --iconv=utf8 ${livehosts[$work_c]}::1C/ /media/backup/rsync/vladimir/1C
  fi
 fi
 let "work_c+=1"
done
echo 'закончили'>>$log
« Последнее редактирование: 25 Июня 2010, 13:50:32 от Владимир Николаевич »

Оффлайн Lion-Simba

  • Старожил
  • *
  • Сообщений: 1126
    • Просмотр профиля
Re: Защищенный блок в bash-скрипте
« Ответ #11 : 25 Июня 2010, 14:25:35 »
Цитировать
#!/bin/bash -e

-e уберите.
Оказываю индивидуальную платную техподдержку широкого профиля. Обращаться в ЛС или Jabber.

Оффлайн RustemNur

  • Автор темы
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 2939
  • умрешь с вами
    • Просмотр профиля
Re: Защищенный блок в bash-скрипте
« Ответ #12 : 25 Июня 2010, 14:53:27 »
-e уберите.

Мда... Слон. Не заметил.  :)

Спасибо!

Оффлайн truegeek

  • FPGA Designer
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 4214
  • аЦкий схемотехник
    • Просмотр профиля
Re: Защищенный блок в bash-скрипте
« Ответ #13 : 25 Июня 2010, 14:55:43 »
гы-ы-ы, а я чет не глянул туда, думал же про этот параметр )))
Цитировать
Если bash запускать с опцией -e или выполнять в скрипте set -e, то после первой же команды с ненулевым статусом возврата произойдет выход из скрипта.

Оффлайн RustemNur

  • Автор темы
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 2939
  • умрешь с вами
    • Просмотр профиля
Re: Защищенный блок в bash-скрипте
« Ответ #14 : 25 Июня 2010, 15:13:56 »
Если bash запускать с опцией -e или выполнять в скрипте set -e, то после первой же команды с ненулевым статусом возврата произойдет выход из скрипта.

В курсе. Но. Слон. Не заметил. Маленький такой. Но слон. Забыл убить. Поговорил с умными людьми. Спасибо. Уже скачал 2 книги по Питон. Пнули.

 

Страница сгенерирована за 0.046 секунд. Запросов: 25.