Автор Тема: Bourn shell скрипт  (Прочетена 9676 пъти)

h4rd2kill

  • Участници
  • ***
  • Публикации: 8
    • Профил
Bourn shell скрипт
« -: Mar 19, 2012, 22:39 »
Здравейте,

Както виждате съм нов във форума и като цяло нов в линукса. Надявам се да не сте много строги с мен ;). Имам задание за линукс скрипт и определено ми трябва помощ.
Решението трябва да бъде преносим Bourne shell скрипт. Не могат да се използват специфични неща от модерните shell-ове като bash, ksh, zsh и т.н.
Ето и задачката:

Да се напише скрипт, който приема като аргумент файл, чието съдържание представлява списък от пълни пътища до файлове, които трябва да бъдат архивирани в tar архив и компресирани. Резултатът от компресията трябва да бъде копиран през SSH на отдалечена машина. Необходимо е да се поддържат следните опции на командния ред:
-f - файл, от който да се четат пътищата към файловете, който ще се архивират
-е - ако някой от пътищата не съществува изпълнението на скрипта се преустановява и се извежда съобщение за грешка; в противен случай несъществуващ път се игнорира
-g - gzip компресия; в противен случай bzip2
-h - отдалечен хост и потребител във вид: user@host
За копиране през SSH може да се използва scp командата, която интерактивно очаква въвеждане на парола (приемайки, че автентикацията е само чрез потребителско име и парола).

Всяка насока или пример ще ми бъде от полза.
Мерси предварително.
Активен

radoulov

  • Напреднали
  • *****
  • Публикации: 116
    • Профил
Re: Bourn shell скрипт
« Отговор #1 -: Mar 20, 2012, 00:09 »
Написах го така, че да работи с bourne shell.
Съвет: ако можеш, не използвай bourne shell!

Код:
#!/bin/sh

_fname= _errexit= _zip= _user_host=
_zip=/bin/bzip2
_ts=`date +%Y%m%d_%H%M%S`
_ext=bz2

_usage_msg="

usage: $0 -f <file_name>  -h user@host [ -e | -g ]

  -f file name containing pathnames
  -e exit if path does not exists
  -g use gzip (otherwise bzip2)
  -h remote user@host

"

die() {
  printf >&2 '%s\n' "$@"
  exit 1
  }

[ $# -lt 1 ] && die "$_usage_msg"

[ -f /tmp/_kill_byte_ ] && rm /tmp/_kill_byte_

set -- `getopt f:egh: "$@"`

[ $? -ne 0 ] && die "$_usage_msg"

while [ $# -gt 0 ]; do
  case $1 in
     -f ) shift;  _fname=$1; shift ;;
     -e ) shift; _errexit=on ;;
     -g ) shift; _zip=/bin/gzip _ext=gz ;;
     -h ) shift; _user_host=$1; shift ;;
     -- ) break ;;
  esac
done

[ -r "$_fname" ] || die "invalid filename: $_fname"

case $_user_host in
   *@* )                                 ;;
    *  ) die "invalid host: $_user_host" ;;
esac

touch arch_"$_ts".tar

while IFS= read f; do
  [ -f "$f" ] || {
    [ "$_errexit" ] &&
      printf '%s\n' "$f" >  /tmp/_kill_byte_
    continue
     }
  tar uf arch_"$_ts".tar "$f"
done < "$_fname"

[ -f /tmp/_kill_byte_ ] && die "invalid path: `cat /tmp/_kill_byte_`"

"$_zip" arch_"$_ts".tar ||
  die 'compressing archive file failed'

scp arch_"$_ts.tar.$_ext" "$_user_host":

« Последна редакция: Mar 20, 2012, 00:48 от radoulov »
Активен

b2l

  • Напреднали
  • *****
  • Публикации: 4786
  • Distribution: MCC Interim
  • Window Manager: - // - // -
  • ...sometimes I feel like screaming... || RTFM!
    • Профил
    • WWW
Re: Bourn shell скрипт
« Отговор #2 -: Mar 20, 2012, 08:58 »
@h4rd2kill интересно ми е сега като те изпитат на този скрипт какво ще кажеш. Та ти един ред от него сигурно не разбираш...
Активен

"Човекът е въже, опънато между звяра и свръхчовека, въже над пропаст. Човекът е нещо, което трябва да бъде превъзмогнато." - Фр. Ницше

h4rd2kill

  • Участници
  • ***
  • Публикации: 8
    • Профил
Re: Bourn shell скрипт
« Отговор #3 -: Mar 20, 2012, 09:27 »
@radoulov Мерси много за отделеното време и труд. Започвам да го разглеждам и тествам подробно..
@b2l Бъркаш се .. знам поне 1 ред от скрипта... (#!/bin/sh)  8). В кръгъ на шегата разбира се  и мерси, че се притесняваш за мен как ще го защитавам .. :) Ако искаш да помогнеш можеш да обясниш подробно логиката на всеки ред :o  [_]3
Активен

b2l

  • Напреднали
  • *****
  • Публикации: 4786
  • Distribution: MCC Interim
  • Window Manager: - // - // -
  • ...sometimes I feel like screaming... || RTFM!
    • Профил
    • WWW
Re: Bourn shell скрипт
« Отговор #4 -: Mar 20, 2012, 09:30 »
@b2l Бъркаш се .. знам поне 1 ред от скрипта... (#!/bin/sh)  8). В кръгъ на шегата разбира се  и мерси, че се притесняваш за мен как ще го защитавам .. :) Ако искаш да помогнеш можеш да обясниш подробно логиката на всеки ред :o  [_]3

А ти ако искаш може да ме хванеш и да ме поразходиш :D. Едно време и аз бях нагъл като теб (не че сега не съм де), затова няма да ти обяснявам нищо :D.
Активен

"Човекът е въже, опънато между звяра и свръхчовека, въже над пропаст. Човекът е нещо, което трябва да бъде превъзмогнато." - Фр. Ницше

h4rd2kill

  • Участници
  • ***
  • Публикации: 8
    • Профил
Re: Bourn shell скрипт
« Отговор #5 -: Mar 20, 2012, 09:42 »
@b2l Бъркаш се .. знам поне 1 ред от скрипта... (#!/bin/sh)  8). В кръгъ на шегата разбира се  и мерси, че се притесняваш за мен как ще го защитавам .. :) Ако искаш да помогнеш можеш да обясниш подробно логиката на всеки ред :o  [_]3

А ти ако искаш може да ме хванеш и да ме поразходиш :D. Едно време и аз бях нагъл като теб (не че сега не съм де), затова няма да ти обяснявам нищо :D.

Изобщо не съм нагъл... просто помолих за помощ без да задължавам никой. Мисля, че това вече се превръща в офф топик ..
Активен

bop_bop_mara

  • Напреднали
  • *****
  • Публикации: 2433
  • Distribution: Debian Testing
  • Window Manager: LXDE
  • Cute and cuddly
    • Профил
Re: Bourn shell скрипт
« Отговор #6 -: Mar 20, 2012, 13:00 »
Мисля, че това вече се превръща в офф топик ..
Определено...

За да се върнем донякъде на темата - сериозно, има ли някой тука, който да има наличен оригинален Bourne Shell, че да се тества  ;D

@h4rd2kill - моят съвет е да си отвориш posix спецификациите:
http://pubs.opengroup.org/onlinepubs/007904875/utilities/contents.html
и да следиш за съвместимост на програмите ти с тях.

@radoulov - може ли обяснение/линк относно конвенцията, която използваш за именуване на променливите (за пръв път виждам така в shell script), и обяснение на while IFS= read f?
Активен

laskov

  • Напреднали
  • *****
  • Публикации: 3166
    • Профил
Re: Bourn shell скрипт
« Отговор #7 -: Mar 20, 2012, 13:15 »
//Малко извън темата: h4rd2kill, radoulov е пропуснал да те предупреди, затова ще го направя аз: На radoulov скриптовете не са просто за 6-ца в училище. Те са висш пилотаж в писането на скриптове и малко хора могат да пишат така, а за начинаещ това е съвсем невъзможно. Така че, ако решиш да го представиш, ще трябва добре да се подготвиш и ще трябва за в бъдеще да поддържаш (доколкото би могъл) нивото. Успех!
Активен

Не си мислете, че понеже Вие мислите правилно, всички мислят като Вас! Затова, когато има избори, идете и гласувайте, за да не сте изненадани после от резултата, и за да не твърди всяка партия, че тя е спечелила, а Б.Б. (С.С., ...) е загубил, а трети да управлява.  Наздраве!  [_]3

h4rd2kill

  • Участници
  • ***
  • Публикации: 8
    • Профил
Re: Bourn shell скрипт
« Отговор #8 -: Mar 20, 2012, 13:41 »
Мерси за съвета @laskov. Това определено ще бъде еднократно представяне и надявам се няма да имам бъдещи срещи с преподавателя :D.

@bop_bop_mara  не знам дали съм те разбрал точно, но към скрипта няма да се използват никакви допалнителни програми просто трябва да изпълнява това което му е зададено.
Ще е полезно малко обяснение от автора или конвертиране към по- простичък вариант ;).

Мерси отново.
« Последна редакция: Mar 20, 2012, 13:44 от h4rd2kill »
Активен

radoulov

  • Напреднали
  • *****
  • Публикации: 116
    • Профил
Re: Bourn shell скрипт
« Отговор #9 -: Mar 20, 2012, 23:09 »
Здравей @bop_bop_mara,

Цитат
[...] може ли обяснение/линк относно конвенцията,
която използваш за именуване на променливите (за пръв път виждам така в shell script)

Не използвам uppercase за да избегна евентуални clashes със системни променливи (PATH, HOSTNAME, LOGNAME и т.н.).
Използвам _varname (или _varname_) - въпрос на стил (и за да избегна clashes с други custom променливи).

Май беше идея на Chris F. A Johnson - http://www.amazon.com/Shell-Scripting-Recipes-Problem-Solution-Approach/dp/1590594711

Цитат
и обяснение на while IFS= read f?

Код:
IFS=

Правя временно (по време на read) reset на IFS (internal field separator),
за да избегна евентуални проблеми с имена на фаилове, които съдържат IFS символи:

Код:
$ _fn='      fname     '
$ printf '%s\n' "$_fn" |
>   while read v; do
>   printf 'one:\n|%s|\n' "$v"
> done
one:
|fname|
$ printf '%s\n' "$_fn" |
>   while IFS= read v; do
>     printf 'two:\n|%s|\n' "$v"
> done
two:
|      fname     |

Здравей @laskov,
благодаря за хубавите думи, не заслужавам чак толкова :)

Здравей @h4rd2kill,
ще ми е по-лесно ако ме питаш за конкретни части от кода ...
Активен

b2l

  • Напреднали
  • *****
  • Публикации: 4786
  • Distribution: MCC Interim
  • Window Manager: - // - // -
  • ...sometimes I feel like screaming... || RTFM!
    • Профил
    • WWW
Re: Bourn shell скрипт
« Отговор #10 -: Mar 20, 2012, 23:33 »
Така! Време е да си натреса тролското мнение! Някой ще ми каже ли защо му пишете домашното?!
Активен

"Човекът е въже, опънато между звяра и свръхчовека, въже над пропаст. Човекът е нещо, което трябва да бъде превъзмогнато." - Фр. Ницше

radoulov

  • Напреднали
  • *****
  • Публикации: 116
    • Профил
Re: Bourn shell скрипт
« Отговор #11 -: Mar 21, 2012, 00:13 »
Защото смятам, че така, както го написах, h4rd2kill може да научи повече.
Надявам се да не греша ...
Активен

h4rd2kill

  • Участници
  • ***
  • Публикации: 8
    • Профил
Re: Bourn shell скрипт
« Отговор #12 -: Mar 21, 2012, 10:28 »
Здравей @radoulov

Бих искал да питам следното:

В скрипта ползваш
Код:
touch arch_"$_ts".tar
.........
.........
  tar uf arch_"$_ts".tar "$f"
както разбирам това ще създаде .tar файл и после с втората команда го update- ва файала.
Въпроса е, защо не се ползва -uf  а само uf.
Също така разширението (.tar.$_ext ) се слага чак накрая с изпращането чрез scp.  Каква е идеята на този метод ?
Активен

radoulov

  • Напреднали
  • *****
  • Публикации: 116
    • Профил
Re: Bourn shell скрипт
« Отговор #13 -: Mar 21, 2012, 11:20 »
Цитат
Код:
touch arch_"$_ts".tar
.........
.........
tar uf arch_"$_ts".tar "$f"

както разбирам това ще създаде .tar файл и после с втората команда го update- ва файала.

Точно така. Някои верси на tar автоматично създават tar archive-а, ако не съществува
(в тези случаи не е необходимо да правиш touch archivename преди update).

Цитат
Въпроса е, защо не се ползва -uf  а само uf.

Това няма значение, можеш да използваш -option и само option, tar разбира и двете.

Цитат
Също така разширението (.tar.$_ext ) се слага чак накрая с изпращането чрез scp.  Каква е идеята на този метод ?

_ext е променлива: default bz2, ако си изпълнил командата s -g: gz.
По този начин scp намира точния файл.
« Последна редакция: Mar 21, 2012, 18:36 от radoulov »
Активен

h4rd2kill

  • Участници
  • ***
  • Публикации: 8
    • Профил
Re: Bourn shell скрипт
« Отговор #14 -: Mar 23, 2012, 13:00 »
Мерси @radulov .

Може ли малко обяснение какво правят тези части:

Код:
[ $# -lt 1 ] && die "$_usage_msg"

.....

Код:
[ $? -ne 0 ] && die "$_usage_msg"

Предполагам, че прави проверка спрямо зададения начин на използване, но не съм сигурен каква е точно проверката.

Поздрави.
Активен

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
Shell картинка
Настройка на програми
Hanibal 0 1747 Последна публикация Jan 08, 2007, 00:35
от Hanibal
Shell скрипт за актуализация на папка
Общ форум
Radev 13 3717 Последна публикация Feb 11, 2007, 13:51
от radoulov
Проблем със shell конзолата
Кошче
madmad 2 1884 Последна публикация Sep 17, 2007, 23:04
от alabal
Проблем с Shell скрипт за НТВ
Настройка на програми
GuessWho 2 2094 Последна публикация Mar 14, 2009, 13:17
от GuessWho
Безплатен Shell Акаунт
Настройка на програми
madmad 2 2274 Последна публикация Jun 28, 2010, 18:03
от betso