вопрос по sh

Модератор: Модераторы разделов

Аватара пользователя
nadge
Сообщения: 1519
ОС: ArchLinux, Ubuntu 10.10

вопрос по sh

Сообщение nadge »

Пишу скрипт - последовательность команд для компиляции и сборки дистрибутива. В программировании на sh при этом полный чайник :)

Вобщем вопрос: как сделать так, чтобы в случае неудачи какой-то команды работа скрипта прерывалась?

В командной строке можно их через && писать, но в скрипте это очень неудобно. IF после каждой команды - еще хуже.


Как еще можно?


З.Ы. В книги и т.п. не отправляйте, я их обязательно прочитаю, но просто сейчас очень мало времени, ответ хотелось бы пораньше узнать.
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: вопрос по sh

Сообщение Liksys »

Есть такая переменная - $?, содержит код завершения последней команды. Если она равна 0, то все нормально, если не нулевое - то ошибка. Проверяй значение ифом.
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: вопрос по sh

Сообщение v04bvs »

Никак.
Ну можешь какой нибудь враппер сделать вроде

Код: Выделить всё

ex(str)
{
    $str
    if [ "$?" != "0" ]; then
        echo "Failed with errorcode $?"
        exit $?
    fi
}


и писать наподобие

Код: Выделить всё

ex("make")
ex("make install")

и тд
Спасибо сказали:
Аватара пользователя
nadge
Сообщения: 1519
ОС: ArchLinux, Ubuntu 10.10

Re: вопрос по sh

Сообщение nadge »

Liksys
v04bvs
Спасибо за ответы. Но это СЛИШКОМ громоздко. Тогда проще написать скрипт, который будет из последовательности этих команд по одной читать и запускать каждую (это я вобщем-то могу написать, правда на php).

Неужели проще никак?


З.Ы. А вообще идея с враппером хороша. Пожалуй воспользуюсь ей.
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: вопрос по sh

Сообщение KiWi »

Разве что писать:

Код: Выделить всё

command || exit
Спасибо сказали:
Аватара пользователя
nadge
Сообщения: 1519
ОС: ArchLinux, Ubuntu 10.10

Re: вопрос по sh

Сообщение nadge »

Остановился на методе v04bvs. Не очень удобно, зато позволяет (после некоторой модификации) выводить текущую команду на экран, чтобы знать, что сейчас выполняется.
Спасибо сказали:
Аватара пользователя
Skladnoy
Сообщения: 90
ОС: Debian

Re: вопрос по sh

Сообщение Skladnoy »

Ммм... А если использовать make?
Спасибо сказали:
Аватара пользователя
Goodvin
Ведущий рубрики
Сообщения: 4333
Статус: ⚝⚠⚒⚑⚖☭☞☣☤&

Re: вопрос по sh

Сообщение Goodvin »

я бы предложил вот так:

Код: Выделить всё

CmdList = "<тут список команд>"

for current_command in $CmdList
do
  echo "Выполняю команду $current_command"
  <выполнение команды>
  <проверка и обработка результатов выполнения>
  <любые другие действия в зависимости от ... >
done


и так далее
-
А книжки зря игнорируете.
"Advanced Bash-Scripting Guide" - просто must read ДО начала писания мало-мальски серьезного скрипта.
Иначе полный бардак будет, и в голове и в коде.
Спасибо сказали:
Аватара пользователя
uptime
Сообщения: 1661
Статус: Drinker with computing problems
ОС: kubuntu 8.04

Re: вопрос по sh

Сообщение uptime »

Если память не изменяет, бэкслеш позволяет переносить команду на новую строку. Или что-то пожожее :)

Код: Выделить всё

make &&\
make install &&\
и т.д.
The answer, my friend, is blowin' in the wind.
The answer is blowin' in the wind.
Спасибо сказали:
Аватара пользователя
Goodvin
Ведущий рубрики
Сообщения: 4333
Статус: ⚝⚠⚒⚑⚖☭☞☣☤&

Re: вопрос по sh

Сообщение Goodvin »

Goodvin писал(а):
14.02.2007 18:36
я бы предложил вот так:

Код: Выделить всё

CmdList = "<тут список команд>"

for current_command in $CmdList
do
  echo "Выполняю команду $current_command"
  <выполнение команды>
  <проверка и обработка результатов выполнения>
  <любые другие действия в зависимости от ... >
done


и так далее
-
А книжки зря игнорируете.
"Advanced Bash-Scripting Guide" - просто must read ДО начала писания мало-мальски серьезного скрипта.
Иначе полный бардак будет, и в голове и в коде.



Да, еще действия внутри цикла можно приправить по желанию && или ||
Смотря какие действия будут.
Спасибо сказали:
Аватара пользователя
nadge
Сообщения: 1519
ОС: ArchLinux, Ubuntu 10.10

Re: вопрос по sh

Сообщение nadge »

Goodvin
О, шикарно! Щас протестирую.

Правда есть один момент: когда команда находится в переменной и вызывается просто

Код: Выделить всё

$command

, то почему-то не работает перенаправление вывода > в этой команде. Как можно это исправить?


А книжки зря игнорируете. "Advanced Bash-Scripting Guide" - просто must read ДО начала писания мало-мальски серьезного скрипта. Иначе полный бардак будет, и в голове и в коде.

Спасибо, сейчас поищу. У меня собственно это просто последовательность команд для сборки. Во всем скрипте нет ни одного условного перехода т.к. они здесь просто не нужны. Хотя когда буду писать скрипты инициализации, понадобится.

Если память не изменяет, бэкслеш позволяет переносить команду на новую строку. Или что-то пожожее

Не изменяет, но писать так (и особенно читать потом) неудобно. Хотя пока скрипт не очень большой, скгодится.
Спасибо сказали:
Аватара пользователя
nadge
Сообщения: 1519
ОС: ArchLinux, Ubuntu 10.10

Re: вопрос по sh

Сообщение nadge »

Ммм... А если использовать make?

Т.е. писать конфигурационный файл для make? Можно, но не умею, а пока научусь, лучше уж shell. Но идея хорошая, спасибо.
Спасибо сказали:
Аватара пользователя
nadge
Сообщения: 1519
ОС: ArchLinux, Ubuntu 10.10

Re: вопрос по sh

Сообщение nadge »

Goodvin
Че-то не работает у меня.

Написал тестовый скрипт:

Код: Выделить всё

#!/bin/sh

CmdList="
echo aaa
echo bbb
"
for current_command in $CmdList
do
   echo $current_command
done

Выводит:
echo
aaa
echo
bbb

Хотя теоретически должен выводить
echo aaa
echo bbb


Я так понял, надо как-то разделять команды в списке...
Спасибо сказали:
Аватара пользователя
Red User
Сообщения: 229
ОС: Debian

Re: вопрос по sh

Сообщение Red User »

nadge

Можно воспользоваться массивом:

Код: Выделить всё

#! /bin/sh

List=(
"echo aaa"
"echo bbb"
)

k=0
while (( k < ${#List[@]} )); do
    echo ${List[${k}]}
    (( k++ ))
done
А ведь когда-то не боялись мы программы любой,
И с одним лишь debug'ом выходили на бой,
И искусно написанный вирус встречали как брата
Спасибо сказали:
Аватара пользователя
nadge
Сообщения: 1519
ОС: ArchLinux, Ubuntu 10.10

Re: вопрос по sh

Сообщение nadge »

Red User
Спасибо.

----------------------

Блин, только перенаправление вывода осталось. Выше писал об этом, поясню на примере:

Код: Выделить всё

#! /bin/sh

List=(
"echo aaa > echo.txt"
"echo bbb >> echo.txt"
)

k=0
while (( k < ${#List[@]} )); do
    ${List[${k}]}
    (( k++ ))
done

Выводит
aaa > echo.txt
bbb >> echo.txt

А вместо этого строчки "aaa" и "bbb" должны писаться в файл. Т.е. все должно работать как при обычном выполнении этих команд. Как можно сделать?
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: вопрос по sh

Сообщение elide »

Red User
тогда это /bin/bash, потому как стандартный sh массивы не умеет.
из всех рассмотренных вариантов, враппер - самое здравое решение.
слава роботам!
Спасибо сказали:
Аватара пользователя
nadge
Сообщения: 1519
ОС: ArchLinux, Ubuntu 10.10

Re: вопрос по sh

Сообщение nadge »

Дошло кажись. Надо запускать shell с командой в качестве параметра

Код: Выделить всё

bash -c "${List[${k}]}"


из всех рассмотренных вариантов, враппер - самое здравое решение.

Согласен. Самые большие возможности и удобнее всего пользоваться.

Попозже (уже сам :) ) разделю на два файла: список-последовательность команд и собственно враппер. Это чтобы от кавычек избавиться, да и удобнее как-то))
Спасибо сказали:
Аватара пользователя
Goodvin
Ведущий рубрики
Сообщения: 4333
Статус: ⚝⚠⚒⚑⚖☭☞☣☤&

Re: вопрос по sh

Сообщение Goodvin »

nadge писал(а):
14.02.2007 21:47
Goodvin
Че-то не работает у меня.

Написал тестовый скрипт:

Код: Выделить всё

#!/bin/sh

CmdList="
echo aaa
echo bbb
"
for current_command in $CmdList
do
   echo $current_command
done

Выводит:
echo
aaa
echo
bbb

Хотя теоретически должен выводить
echo aaa
echo bbb


Я так понял, надо как-то разделять команды в списке...


Решение этой и других проблем можно найти в указанной мной доке по bash.
Спасибо сказали:
Аватара пользователя
nadge
Сообщения: 1519
ОС: ArchLinux, Ubuntu 10.10

Re: вопрос по sh

Сообщение nadge »

ОК.


Спасибо за ответы. Вобщем, пойду читать доку :)
Спасибо сказали:
Аватара пользователя
Skladnoy
Сообщения: 90
ОС: Debian

Re: вопрос по sh

Сообщение Skladnoy »

Аналог тестового скрипта в виде makefile
Четыре пробела перед выражением надо заменить табулятором

Код: Выделить всё

ALL:
     gcc $(CFLAGS) -c some_src1.c -o some_src1.o
     gcc $(CFLAGS) -c some_src1.c -o some_src2.o
     gcc some_src2.o some_src1.o -o executable


Ну и для сборки и установки кроме sh-скриптов (улыбка), Makefile есть еще autotools/cmake/scons/и др.
Спасибо сказали: