Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: AMD в Dec 28, 2011, 21:00



Титла: shell скрипт
Публикувано от: AMD в Dec 28, 2011, 21:00
Значи въпроса ми е следния. Изпитвам затруднения да интегрирам допълнителна функция към дадена команда.

Код
GeSHi (Bash):
  1. du -csh $iso &>size
Код
GeSHi (Bash):
  1. dd if=$iso | pv -ptrs $size -i2 | dd of=$flash

Но не съм сигурен дали изобщо може да заработи по този начин?

Как точно трябва да се сформира реда с командата
Код
GeSHi (Bash):
  1. du -csh $iso
, за да може да вкара размера на файла в променлива която да се чете в
Код
GeSHi (Bash):
  1. pv -ptrs $size -i2


Титла: Re: shell скрипт
Публикувано от: romeo_ninov в Dec 28, 2011, 22:19
а ако направиш нещо от рода няма ли да работи:
Код:
a=$(pv -ptrs $size -i2 $iso)
dd if=$iso of=$flash нещо_си_за_размера=$a


Титла: Re: shell скрипт
Публикувано от: gat3way в Dec 28, 2011, 23:55
РОКО, шел променливите не са файлови дескриптори и не можеш да pipe-ваш изхода в тях. romeo_ninov ти е написал едното решение, другото е да ползваш обратни кавички:

Цитат
pv -ptrs `du -csh $iso` -i2

при положение че си export-нал $iso.

Имай предвид че без да проверяваш exit кода от du, можеш да си докараш неприятни проблеми.


Титла: Re: shell скрипт
Публикувано от: AMD в Dec 29, 2011, 09:44
РОКО, шел променливите не са файлови дескриптори и не можеш да pipe-ваш изхода в тях. romeo_ninov ти е написал едното решение, другото е да ползваш обратни кавички:

Цитат
pv -ptrs `du -csh $iso` -i2

при положение че си export-нал $iso.

Имай предвид че без да проверяваш exit кода от du, можеш да си докараш неприятни проблеми.

Ти ме разбра по-точно какво имам в предвид. Но неприятностите са че трябва да извлека от изхода само цифрите. Може би ще го оставя както е.


Титла: Re: shell скрипт
Публикувано от: gat3way в Dec 29, 2011, 11:04
Да не кажеш че съм лош само :)

Цитат
pv -ptrs `du -csh -B1M  $iso 2>/dev/null|grep total|awk '{print $1}'` -i2

Това е в мегабайти, ако ти трябва в други единици виж man страницата на du.


Титла: Re: shell скрипт
Публикувано от: AMD в Dec 29, 2011, 12:27
Да не кажеш че съм лош само :)

Цитат
pv -ptrs `du -csh -B1M  $iso 2>/dev/null|grep total|awk '{print $1}'` -i2

Това е в мегабайти, ако ти трябва в други единици виж man страницата на du.

То точно в мегабайти ми трябва да е изхода, ама виж някак ми трябва само да отчете обема без текста ->

du -csh iso/altlinux-6.0.0-centaurus-x86_64-ru-live-cd.iso
661M   iso/altlinux-6.0.0-centaurus-x86_64-ru-live-cd.iso
661M   итого


Титла: Re: shell скрипт
Публикувано от: gat3way в Dec 29, 2011, 12:36
Дам, не обича да му излиза на руски :)

Айде пробвай така:

pv -ptrs `du -csh -B1M  $iso 2>/dev/null|tail -n1|awk '{print $1}'` -i2


Титла: Re: shell скрипт
Публикувано от: AMD в Dec 29, 2011, 12:46
Дам, не обича да му излиза на руски :)

Айде пробвай така:

pv -ptrs `du -csh -B1M  $iso 2>/dev/null|tail -n1|awk '{print $1}'` -i2

То хубаво ама нещо не мога да го излъжа, и не знам дали има шансове, значи с pv искам да изкарам прогрес индикатор при изпълнение на dd но трябва някак за опцията  "-s" във "pv" да се вземе размера на ISO образа пример "pv -s 600m" и само тази идея ми дойде на ум но нещо не е белязана от успех.

При стартиране на трансфера прогрес индикатора показва ..

[======================================================================] 100000%

Нещо което не е реално уж трябва да започне от 0% и да брои до 100% в зависимост от размера при du -csh $iso


Титла: Re: shell скрипт
Публикувано от: gat3way в Dec 29, 2011, 13:06
Ами показва тези неща най-вероятно заради мерните единици. Това което съм ти дал връща големината на iso файла в мегабайти, а pv си прави сметките в байтове. Демек максималната големина ти е 600, но dd ще му подаде 600 милиона байта, демек далееееч над 100%. Виж внимателно аргументите към du командата и го промени от мегабайти, да ти връща големината в байтове.


Титла: Re: shell скрипт
Публикувано от: AMD в Dec 29, 2011, 13:25
Ами показва тези неща най-вероятно заради мерните единици. Това което съм ти дал връща големината на iso файла в мегабайти, а pv си прави сметките в байтове. Демек максималната големина ти е 600, но dd ще му подаде 600 милиона байта, демек далееееч над 100%. Виж внимателно аргументите към du командата и го промени от мегабайти, да ти връща големината в байтове.

Значи аз го оправих да показва реално като махнах -B1M всичко стана нормално.
http://imglink.ru/pictures/29-12-11/3aae4cb73a0597acd414299c73a53fc3.jpg

А ето и кода, малко е грозен все още но е в процес на доработка, преди ги бях понаучил ама сега съм забравил доста от нещата как стават.



Титла: Re: shell скрипт
Публикувано от: AMD в Dec 29, 2011, 13:55
Е gat3way не вярвах че някога мога да ти кажа думата Благодаря.

Ето и крайния код ако някой има желание да го ползва или да го подобрява.

Код
GeSHi (Bash):
  1. #!/bin/bash
  2. # Автор: Росен Александров (и благодарности към gat3way)
  3. # За мен: roko@jabber.calculate-linux.org , sandikata@yandex.ru, Скайп ROKO__2
  4. # Важно за да работи правилно скрипта трябва да го поставите в /usr/local/bin както и да имате инсталиран пакет "pv", поне в AltLinux се казва така.
  5.  
  6. if [ `id -u` -ne 0 ] ;
  7. then
  8. exec notify-send -t 10000 "Нямате администраторски права! Стартирайте скрипта като администратор или със sudo dd-flash" ; exit 1
  9. fi
  10.  
  11. echo "За да можете да създадете Жив флаш диск трябва да го поставите в USB порта на компютъра, като флаш диска не трябва да е монтиран!"
  12. echo
  13. echo "Пълен път до ISO (Пример /home/user/Загрузки/iso.iso)"
  14. read iso
  15.  
  16. while ! [ -s $iso ]; do
  17. printf "Избрания файл не съществува. Моля изберете съществуващ.  ->  "
  18. read iso
  19. done
  20. echo
  21. while ! fdisk -s $flash &>/dev/null; do
  22.    printf "Въведете съществуващ флаш диск. Пример /dev/sdc  ->  "
  23. read flash
  24. done
  25. echo
  26. echo "Операцията ще унищожи информацията на вашия флаш диск!"
  27. echo "Сигурни ли сте че искате да продължите?"
  28. select yn in "Да" "Не"; do
  29. case $yn in
  30. # Разкоменирайте този ред ако искате по-кратка информация за трансфера Да ) dd if=$iso | pv -ptr -N $iso | dd of=$flash ;;
  31. Да ) dd if=$iso | pv -ptrs `du -csh $iso 2>/dev/null|tail -n1|awk '{print $1}'` | dd of=$flash ; exit 1 ;;
  32. Не ) exit;;
  33. esac
  34. done
  35.  


Титла: Re: shell скрипт
Публикувано от: gat3way в Dec 29, 2011, 20:38
ROKO_, разбирам че Убунту не ти е любима дистрибуция, ама няма да е зле да промениш това:

Цитат
if [ `id -u` -ne 0 ] ;

Това няма да сработи ако викаш скрипта със sudo. Проверявай $EUID променливата - ще сработи и в двата случая.


Титла: Re: shell скрипт
Публикувано от: AMD в Dec 29, 2011, 21:56
ROKO_, разбирам че Убунту не ти е любима дистрибуция, ама няма да е зле да промениш това:

Цитат
if [ `id -u` -ne 0 ] ;

Това няма да сработи ако викаш скрипта със sudo. Проверявай $EUID променливата - ще сработи и в двата случая.

$EUID ?!

Нещо не мога да зацепя.


Титла: Re: shell скрипт
Публикувано от: gat3way в Dec 29, 2011, 22:26
A, това принтвало euid-а все пак, моя грешка. Както и да е, $EUID е по-бърз вариант, не се вика външна програма.


Титла: Re: shell скрипт
Публикувано от: shoshon в Dec 29, 2011, 23:08
Код
GeSHi (Bash):
  1. while ! fdisk -s $flash &>/dev/null; do
  2.   printf "Въведете съществуващ флаш диск. Пример /dev/sdc  ->  "
  3. read flash
  4. done

Това не е никак хубав код! Как ще спреш програмата? В смисъл Ctrl+Backspace трябва да се използва...


Титла: Re: shell скрипт
Публикувано от: AMD в Dec 29, 2011, 23:27
Код
GeSHi (Bash):
  1. while ! fdisk -s $flash &>/dev/null; do
  2.   printf "Въведете съществуващ флаш диск. Пример /dev/sdc  ->  "
  3. read flash
  4. done

Това не е никак хубав код! Как ще спреш програмата? В смисъл Ctrl+Backspace трябва да се използва...

Аз не искам да се спира програмата, а да попита отново за валиден файл/дял