Автор Тема: [BASH] While яде първия знак, на вас случвало ли се е?  (Прочетена 16940 пъти)

remotexx

  • Напреднали
  • *****
  • Публикации: 3210
    • Профил
Гога като се поосвободя малко ще го мъча, но дотук на прима Виста имам некой въпроси
1. Казваш да подадем името на файла като параметър, но не виждам кода да ползва параметри... script.bash param1 param1 etc.
2. Може би имаш предвид да пренасочим oti > script.bash

По въпроса за питона, ако пак ще си ги мерим... аз предлагам с# т.е. .net core
Щото питонджиите лъжат, също както и джаварите наремето, споменават само езика и крият якия фреймуърка зад него, който всъщност смятат да ползват  ???

Наслушал съм се на безсмислени спорове между пишман програмисти дето си мерят езиците, а всъщност си мерят фреймуърка и даже не се усещат че то на днешно време всички езици почти се изравниха.
« Последна редакция: Mar 28, 2020, 08:17 от remotexx »
Активен

spec1a

  • Напреднали
  • *****
  • Публикации: 3852
    • Профил
   Добър вариант според мен е да се ползва командата strace,
може да се види много добре какво точно се извиква,какви
файлове се отварят и т.н.
Активен

go_fire

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 8780
  • Distribution: Дебиан Сид
  • Window Manager: ROX-Desktop / е17
  • кашик с гранатомет в танково поделение
    • Профил
    • WWW
Уф, доста сте писали.

Remo, излъгал съм :( Заковал съм го.

4096, тъпото е, че това, което правя, y-dl го прави и сам. Мейк чудесно го е разбрал. Вземам наличния поток аудио с най-малък размер и същото за видеото. След това ги съединявам. Самия y-dl има такава възможност с --merge-output-format mkv. И отново го прави с ffmpeg. Но го прави единствено при подадени изрично параметрите, които Мейк е дал в мнението си.

Аз лично изобщо не съм убеден, че разработчиците y-dl наистина биха го направили при най-малките размери. При най-големите да. Например те знаят ли за съществуването на форматите 597, 599 и 600? Появиха се за малко този месец и пак изчезнаха. А тези формати почти заместват 3gp и почти могат да се ползват в реално време. Те знаят ли за 139, който е много рядко срещан и е само след като нещо е било предадено поточно до момента, когато тубата не реши да го прекодира? А той понякога е счупен. Но е по-кратък от 249. И изобщо 249 ли биха изтеглили или огромния 140? Защото 140 е m4a, а 249 e webm (в действителност opus, но името лъже). 249 е 50 КБ/с, а 140 е 128 КБ/с, което го прави троен по размер.

Освен това, в предни мнения казвах, че y-dl никога не са пробвали нещото си при бавни връзки или поне не са ги симулирали с шейпър. Y-dl увисва и спира да има признаци на живот на всеки няколко минути. Затова когато тегля нещо с него винаги ми се налага да го слагам в едноредов цикъл в конзолата от типа:

Код
GeSHi (Bash):
  1. for i in `seq 1 20`;do youtube-dl -f 599/600/249/250/139/251/140 https://www.youtube.com/watch?v=KMU0tzLwhbE  & sleep 200 && pkill -9 youtube-dl ;done

Синтаксиса на bash e много мощен с десетилетия допълван и способен на големи автомагии. Конзолата сама по себе си не е нещо по-различно от текстов редактор с вградено управление на файлове. Нещо като примитивен Емакс или Вим. За съжаление обаче, когато е измисляна концепцията, това е било на бързо и не са се съобразили, че при такава организация си поддтикван към грешки на всеки сантиметър. Не случайно казвах да се пробва нещото в изолирана среда (нов каталог). С Bash това е неизбежно във всеки един случай, ако ще Brian Kernighan да пише.

Ще ти обясня подробно, какво прави кода, но ще е в ново мнение. По-удобно ми е да го направя в Емакс, а не директно във форума.
Активен

В $por4e2 e истината  ;)

***

Aко даваха стипендия за най-глупави, щях да съм човека с най-много Mини Kупъри

***

Reborn since 1998 || 15.09.2007 totally М$ free && conscience clear

4096bits

  • Напреднали
  • *****
  • Публикации: 6152
    • Профил
...

Не си мерим езиците. Аз съм любител програмист и програмирам за да си улесня живота. Досега не съм имал нужда от C#.
Впрочем, не намирам нищо лошо във библиотеки, които не идват с езика. Улесняват живота
И смятах да ползвам urllib, за да не се налага да се дърпат и инсталират още неща.

Цитат
Освен това, в предни мнения казвах, че y-dl никога не са пробвали нещото си при бавни връзки или поне не са ги симулирали с шейпър. Y-dl увисва и спира да има признаци на живот на всеки няколко минути.
Погледнах по-обстойно опциите, защото ползвам само няколко.
Тези нямат ли отношение към това, за което споменаваш? Сваляне при малка скорост и прекъсването след време.
Код:
  Download Options:
    -r, --limit-rate RATE            Maximum download rate in bytes per second (e.g. 50K or 4.2M)
    -R, --retries RETRIES            Number of retries (default is 10), or "infinite".
    --fragment-retries RETRIES       Number of retries for a fragment (default is 10), or "infinite" (DASH, hlsnative
                                     and ISM)

Видях и че има опция -F, с която могат да се вземат възможните видео формати:
Код:
$ youtube-dl -F https://www.youtube.com/watch?v=eURPTdaO3ck
[youtube] eURPTdaO3ck: Downloading webpage
[youtube] eURPTdaO3ck: Downloading video info webpage
[info] Available formats for eURPTdaO3ck:
format code  extension  resolution note
249          webm       audio only tiny   56k , opus @ 50k (48000Hz), 3.07MiB
250          webm       audio only tiny   71k , opus @ 70k (48000Hz), 4.06MiB
140          m4a        audio only tiny  128k , m4a_dash container, mp4a.40.2@128k (44100Hz), 7.94MiB
251          webm       audio only tiny  138k , opus @160k (48000Hz), 8.12MiB
160          mp4        256x144    144p   19k , avc1.4d400c, 30fps, video only, 635.95KiB
133          mp4        426x240    240p   34k , avc1.4d4015, 30fps, video only, 876.81KiB
278          webm       256x144    144p   60k , webm container, vp9, 30fps, video only, 1.53MiB
134          mp4        640x360    360p   78k , avc1.4d401e, 30fps, video only, 1.43MiB
242          webm       426x240    240p   89k , vp9, 30fps, video only, 2.40MiB
135          mp4        854x480    480p  153k , avc1.4d401f, 30fps, video only, 2.40MiB
243          webm       640x360    360p  169k , vp9, 30fps, video only, 4.37MiB
244          webm       854x480    480p  284k , vp9, 30fps, video only, 4.44MiB
136          mp4        1280x720   720p  285k , avc1.4d401f, 30fps, video only, 4.14MiB
137          mp4        1920x1080  1080p  482k , avc1.640028, 30fps, video only, 6.68MiB
247          webm       1280x720   720p  551k , vp9, 30fps, video only, 13.23MiB
248          webm       1920x1080  1080p  979k , vp9, 30fps, video only, 22.45MiB
18           mp4        640x360    360p  238k , avc1.42001E, mp4a.40.2@ 96k (44100Hz), 14.89MiB (best)

Може още да се ползва и тази опция, за да се пести време и трафик:
Код:
--youtube-skip-dash-manifest     Do not download the DASH manifests and related data on YouTube videos
« Последна редакция: Mar 28, 2020, 12:56 от 4096bits »
Активен

As they say in Mexico, "Dasvidaniya!" Down there, that's two vidaniyas.

go_fire

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 8780
  • Distribution: Дебиан Сид
  • Window Manager: ROX-Desktop / е17
  • кашик с гранатомет в танково поделение
    • Профил
    • WWW
Код
GeSHi (Bash):
  1. #!/bin/bash
  2.  
  3. #  Това го знаеш покрай Смоко. Казва се на обвивката къде да търси
  4. #  интерпретатора. Без него ще се пробва със /bin/sh, но само ако има
  5. #  chmod +x. Другия вариант е да го подадеш директно на интерпретатора
  6. #  с например sh script
  7.  
  8. # Нещо, което винаги съм ненавиждал в обяснение на нов език. Никой,
  9. # никога не казва, как се отбелязват коментари. За тях може да е
  10. # подразбиращо, но за новак това е безценна информация, която не се
  11. # споделя. Bash има само едноредови коментари и всички те започват с
  12. # диез #. Ако ще пишеш коментари на няколко реда, всеки трябва да
  13. # започва с диез. Когато се пише нещо за конзола или обикновен текст,
  14. # конвенцията е да е ограничено до 70 знака на ред. Както виждаш, не
  15. # го спазвам и в реална ситуация, биха ми дърпали ушите.
  16.  
  17. unset y f l d ft
  18. declare -a yar
  19. declare -a far
  20.  
  21. #  Първия ред премахва стойностите на променливите, които се
  22. #  ползват. Това е със санитарна цел. Може да прескочи нещо от
  23. #  средата. С другите две изрично декларирам, че ще ползвам масиви. Не
  24. #  е задължително, може да стане в движение създаването им, но кой
  25. #  знае защо се води добра практика във всички езици през всички
  26. #  времена. Е то bash не е език, ама все пак. Най-вероятно спестява
  27. #  работа на професора.
  28.  
  29.  
  30. echo "Loading..."
  31.  
  32. # Почвам да давам съобщения в конзола, какво се случва, защото следват
  33. # бавни операции. Има по изключение само едно съобщение, което не е с
  34. # цел да ми казва, че следва нещо бавно. Ще стигнем и до него.
  35.  
  36. if [ oti -nt oti2 ]; then
  37.  
  38.    #  Навлизане в първото условие. Тук питам дали файл oti2
  39.    #  съществува и дали той е със същата дата на промяна, каквато има
  40.    #  oti. Вече обясних, че всички обръщения към y-dl са бавни
  41.    #  операции траещи по много минути (поне пет), затова гледам да ги
  42.    #  избягвам.
  43.  
  44.    # Oti e моя списък за теглене. Той може да съдържа празни редове
  45.    # за разграничение и коментари. Oti2 съдържа само и единствено
  46.    # индефикатори. Oti2 ще се промени, когато се промени и oti.
  47.  
  48.    # Това условие Ако е първата причина този код да не може да се
  49.    # изпълни от обикновен sh. Също е демонстрация, колко много е
  50.    # мислено по Bash през годините. Специално тази магия е само една
  51.    # от многото:
  52.    # http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html. След
  53.    # малко ще ползваме и масиви, също нещо непосилно за sh.
  54.  
  55.  
  56.    y=$(youtube-dl --get-id -a oti)
  57.    echo "$y" > "oti2"
  58.  
  59.    # Това е бавната операция по вземане на индефикаторите. Те се
  60.    # записват в променлива на средата, която веднага в следващия ред
  61.    # наливам във временния документ oti2. Налага ми се да записвам
  62.    # променливите във временни документи, защото непрекъснато скачам
  63.    # от едно пакетно изпълнение към друго. Това ще го разясня към
  64.    # края, защо е така, но съм го писал и в темата.
  65.  
  66.  
  67.    #https://askubuntu.com/questions/62492/how-can-i-change-the-date-modified-created-of-a-file
  68.    touch -d "$(date -R -r oti)" oti2
  69.  
  70.    # Touch е команда, която служи за промяна времената на
  71.    # документите. Тук я ползвам в оригиналното ѝ значение като казвам
  72.    # oti2 да придобие времето за промяна на oti. По този начин в
  73.    # условието на 17-и ред [ oti -nt oti2 ] разбирам дали oti е бил
  74.    # променен и се налага oti2 отново да бъде налят. Страничния ефект
  75.    # на touch е, че създава нови документи. Парадоксално, това е
  76.    # много по-използваната му функция.
  77.  
  78.    #Тук също ще създаде oti2, ако не съществува. Но би трябвало
  79.    #предния ред да го е създал. Ако нещо между тези две инструкции
  80.    #изтрие oti2, тук ще получим първата си катастрофа. Ето, какво
  81.    #значи да плаваш в непознати земи. В програмирането винаги е така.
  82.  
  83. fi
  84.  
  85. # Край на условието [ oti -nt oti2 ].
  86. # Ако условието не е изпълнено, то ще мина през това за под секунда.
  87.  
  88.  
  89. echo "Check..."
  90.  
  91. # Следва нова бавна операция и ново побутване на потребителя, стига да наблюдава случващото се.
  92.  
  93. while read -r l;
  94. do
  95.  
  96.    #  Тази магия значи, че ще се чете обикновен текст от документ и
  97.    #  всеки ред ще бъде присвояван на променливата $l (от line или на
  98.    #  български − ред). Както си забелязал, във философията на Юникс
  99.    #  е да се пести. Всичко което не може да се сведе до една буква,
  100.    #  се свежда до две, а ако не може до три. Трябва да сме ефективни
  101.    #  и да мислим за ресурсите. При бързи професори и изобилие от
  102.    #  памет лесно се забравя, но все пак трябва да се стараем.
  103.  
  104.    # До края на цикъла Докато ще се извършват действия върху тази
  105.    # променлива. Всяка врътка ще е върху следващия ред.
  106.  
  107.  
  108.  
  109.    echo "$l e super";
  110.    # Ето тук открих, че Докато между врътките ми яде буква. Слагането
  111.    # на съобщения в кода е лесният и удобен начин да се прави това,
  112.    # което споменатия от Спец. strace прави за транслиран код. Когато
  113.    # имаме интерактивно изпълнение сме благословени. Същото би
  114.    # трябвало да е и за Смоку. Макар там във версия три да влязоха
  115.    # едни езикови конструкции, които са много тежки. Идеята за
  116.    # структури от данни като масиви и вектори е безкрайно по-проста
  117.    # от структури като класове и обекти. Мен те ме отказаха от
  118.    # програмирането. Разбира се, ако си като да речем Ремо и пишеш
  119.    # някакви чудовищни системи като примерно Sales Forge, то без тях
  120.    # не може. Но, ако нещото е само няколко хиляди реда, то такива
  121.    # чудовищни структури от данни само пречат и внасят неразбиране,
  122.    # какво точно се прави. Затова за Смоку от версия три може и да не
  123.    # е вече вярно. Там съобщенията биха били безсмислени, ако се
  124.    # ползват обекти. Затова са измислени едни системи за изпитване,
  125.    # като са разделени на класове. Например най-популярните класове
  126.    # са точкови и непрекъснати.
  127.  
  128.  
  129.  
  130.  
  131.  
  132.    if [ -f *"$l.mkv" ]; then
  133. # Тук проверявам дали съществува обикновен документ наречен
  134. # *име.mkv. Звездичката и въпросителния знак (както със
  135. # сигурност знаеш) са специален клас знаци наречени
  136. # заместващи. Ydl именува изтеглените клипове с име, което
  137. # съдържа заглавието на клипа, както е в тубата, дефис,
  138. # идентификатора му и разширение. Това не може да се предугади
  139. # с --get-name, защото Ydl на свой ред сменя част от знаците в
  140. # заглавието, които смята за специални. Такъв например е
  141. # наклонена черта (/). Схемите за именуване на Ydl подлежат на
  142. # промяна, но подразбиращите се, ми харесват. Например, ако
  143. # теглиш всички налични формати, Ydl е достатъчно умен, за да
  144. # сложи в заглавията им и тази информация. Изобщо Ydl е един
  145. # много мощен и добре измислен инструмент от вида „швейцарско
  146. # ножче“.
  147.  
  148.  
  149.  
  150. echo "Matroska: OK"
  151. # Това е единственото безсмислено съобщение. Сложено е, защото
  152. # Bash не позволява да не се прави нищо при изпълнено условие
  153. # Ако. А нямаме обръщане на логиката (!), когато проверяваме
  154. # за наличие на документ. Логиката, която се развива надолу е
  155. # следната: първо се тегли звука, ако той е изтеглен, се тегли
  156. # картинката, ако са изтеглени и двете, тогава с ffmpg се
  157. # съединяват. Ако вече имаме направен mkv, то работата е
  158. # свършена и трябва да минем на следващия ред от oti2.
  159.  
  160.  
  161.  
  162.    else
  163.  
  164. if [ -f *"$l.mp4" ]; then
  165.    # Тук навлизаме в условието, ако не е свършена работата на
  166.    # обратно. Проверяваме дали картинката е потеглена. Винаги
  167.    # тегля mp4, за да не стават обърквания. И без това винаги
  168.    # е по-малък от webm при еднакви показатели. Тук системата
  169.    # за именуване на Ydl би била полезна, но все пак така се
  170.    # усложняват излишно нещата. Трябва човек да се придържа
  171.    # към по-простите решения, доколкото е възможно.
  172.  
  173.    far[0]="*$l.mp4"
  174.    # Тук се започва наливането на масива (този е едномерен,
  175.    # неименован пак за удобство). При изтеглен mp4, значи е
  176.    # време за съединяване. Първия елемент е името на
  177.    # въпросния mp4.
  178.  
  179.    if [ -f *"$l.m4a" ]; then
  180. far[5]="m4a"
  181. # Както казах звука може да е webm или m4a, затова
  182. # проверяваме, кое от двете се е свалило. За нас Ydl е
  183. # външен инструмент и няма друг начин да научим, какво
  184. # е изтеглил. Присвояваме на шести елемент това
  185. # име. Защо точно шести, след малко.
  186.  
  187.  
  188.    else      
  189. far[5]="webm"
  190.  
  191.    fi
  192.  
  193.    echo "Convert..."
  194.    # След като вече имаме имената на двата медийни документа,
  195.    # вече може да пристъпим към съединяването им. Тази задача
  196.    # за ffmpeg е бърза на професори от последните двадесет
  197.    # години. Но все пак е нашата крайна цел и е добре да я
  198.    # отбележим. Затова, въпреки, че задачата е бърза, а и
  199.    # ffmpeg e приказлив като жена, ние даваме съобщение за
  200.    # предстоящото ѝ изпълнение.
  201.  
  202.  
  203.    far[1]=$(echo ${far[0]})
  204.    far[4]=${far[1]:0:-3}
  205.    #  Първия ред е поради особености на Bash. Не можем да
  206.    #  използваме директно първия елемент, защото Bash няма да
  207.    #  ни преобразува звездичката. Има второ важно познание за
  208.    #  Bash, освен, че не е език за програмиране. А второто
  209.    #  произлиза от първото. То е, че не трябва да мислим Bash
  210.    #  за по-умен, от колкото е. Той е мъж, а не жена. Не може
  211.    #  да прави по две неща едновременно. Трябва да му се
  212.    #  подават ясни инструкции, еднозначни и по най-много едно
  213.    #  нещо наведнъж. В това си качество прилича на Асемблер.
  214.  
  215.    # Втория ред ни казва да направим подниз от низ. Странното
  216.    # заклинание значи, че махаме последните три букви
  217.    # (mp4). Тях ще сменим с нашите разширения. Тук става ясно
  218.    # защо този елемент е пети, а преди малко използвахме
  219.    # шести. Запазваме втори, трети и четвърти за истинските
  220.    # имена. Втория вече го съставихме на предния ред. Остават
  221.    # трети и четвърти. Вадене на подниз с този синтаксис в
  222.    # по-стари версии на Bash не беше възможно и тогава
  223.    # трябваше да ползваме малко математика. Да изчисляваме
  224.    # дължината на името и т.н.
  225.  
  226.  
  227.  
  228.    far[2]=${far[4]}${far[5]}
  229.  
  230.    far[6]="mkv"
  231.    far[3]=${far[4]}${far[6]}
  232.  
  233.    ffmpeg -i "${far[1]}" -i "${far[2]}" -c:v copy -c:a copy -strict experimental "${far[3]}"
  234.    #  НАЙ-накрая се стига и до самото съединяване, след като
  235.    #  сме си сглобили имената. Новото тук на по-горните
  236.    #  редове отнасящи се към трети и четвърти елемент. Тези
  237.    #  заклинания са просто сливане на низове.
  238.  
  239.  
  240.    d=$(date -R -r "${far[1]}")
  241.    touch -d "$d" "${far[3]}"
  242.    # Тук правим нещо, което вече сме правили. Сменяме датата
  243.    # на промяна на туко що произведения контейнер Матрьошка с
  244.    # датата на изтеглените потоци. Това е нещо, което и самия
  245.    # Ydl също прави. Слага датата на качване в тубата. Също е
  246.    # нещо, което през годините съществуване на Ydl много ме е
  247.    # дразнило, защото прави ls -rt безполезен. Но пък те
  248.    # знаят, какво правят. Така се запазва поредност. Затова
  249.    # го правя и аз. Ydl няма как да му се препише вина, ако
  250.    # клиповете не са качвани в поредност, а разбъркано според
  251.    # странични причини.
  252.  
  253.    # Тук по-горния ред е отново, защото Bash е мъж. Не може
  254.    # да прави две неща едновременно, затова ни се налага да
  255.    # ползваме променлива. Излишно е да казвам, че d е
  256.    # съкращение от „дата“(date).
  257.  
  258.    # Забравих да го спомена по-нагоре, но синтаксиса $( ) е
  259.    # нова форма на все още поддържания и по-кратък, но не
  260.    # толкова отличителен ``. Това значи, че създаваме нова
  261.    # обвивка, в която изпълняваме нещо и го връщаме на
  262.    # майчиния процес. Ако забелязваш управлението на масиви
  263.    # се извършва по същата технология, затова Bash се
  264.    # обърква. Стават детски процес на детски процес. Той не
  265.    # може да работи толкова надълбоко.
  266.  
  267.    rm "${far[1]}" "${far[2]}"
  268.    # Изтриваме вече ненужните звук и видео. Добрия погромист
  269.    # кърти, чисти и извозва боклука след себе си. Не остава
  270.    # отпадъци след като е свършил. Питай ме защо не ползвам
  271.    # Усхадуя! Тук имаме риск, ако не са се събрали добре
  272.    # документите по някаква причина, то да повторите бавния
  273.    # процес по тегленето. Но това е по-малко вероятно и
  274.    # по-добре да сте си поринали. Ако е писано пак да чакате
  275.    # с часове, ще чакате, няма де да ходите. Бърза е само
  276.    # работата за другите, които желаят резултатите. За този,
  277.    # който я прави е толкова, колкото е.
  278.  
  279. else
  280.    # Тук сме научили, че все още нямаме mp4, следователно
  281.    # трябва да си го потеглим. По принцип променливата за тип
  282.    # на документа за теглене ($ft) е ненужна, но ще я
  283.    # използваме пак, когато искаме да разберем, какво ще
  284.    # теглим. Тук може да сложим и друга променлива и след
  285.    # това вместо два пъти (или три според случая) да извикаме
  286.    # само веднъж --get-filename, но както коментирах, това би
  287.    # направило кода много сложен и още по-чуплив от сега.
  288.  
  289.    ft="597/160/133"
  290.    if [ -f *"$l.m4a" ]; then
  291. # Проверяваме имаме ли *идентификатор.m4a. Ако вече е
  292. # наличен, ще теглим mp4. Тук особеното е, че Ydl ни
  293. # позволява да създадем текстова база от данни с вече
  294. # изтеглени неща, да не се теглят отново. Използваме
  295. # тази чудесна възможност, едва след като ще теглим
  296. # картинката, защото тази база е проста и не ни дава
  297. # възможност да теглим нещо в различни формати. Което
  298. # може да се счита за нейно предимство. Това е
  299. # единственото в този код, което нямаше да ни достави
  300. # -f 17/36, докато съществуваше. Забравих да кажа, че
  301. # разделителя наклонена черта означава избор, като се
  302. # тегли първия наличен. Сиреч това е логическо
  303. # Ако. Логическото И е запетайка.
  304.  
  305. yar[1]="youtube-dl --download-archive ito -f "$ft" $l &"
  306. # Защо отново сглобяваме масиви, ще уточним след малко.
  307.  
  308.    elif [ -f *"$l.webm" ]; then
  309. # Казахме, че звука може да е webm, освен m4a. Ако
  310. # нямаме m4a не е задължително да не сме го изтеглили
  311. # в webm. Webm e с по-голям приоритет във възможните
  312. # формати, а нашата логика тече на обратно. Първо
  313. # проверихме за mkv, после за mp4 и накрая за
  314. # звука. Ако и това не мине, значи нямаме дори звук и
  315. # ще теглим и него.
  316.  
  317. yar[1]="youtube-dl --download-archive ito -f "$ft" $l &"
  318. # Имаме звук със сигурност, значи е време за
  319. # картинката. Тук имаме „суха“(DRY) ситуация с горната
  320. # проверка, но няма как. Може да се изнесе на
  321. # променлива и да не сме сухи, но усложняваме кода и
  322. # предизвикваме съдбата да влезе в ролята на
  323. # разгорещен негър. По-добре да сме сухи.
  324.  
  325. if [ -f *"$l.m4a."* ]; then
  326.    rm  *"$l.m4a."*
  327. fi
  328.  
  329. # Докато сме теглили е възможно да сме започнали с m4a, но вече да е наличен webm.
  330.  
  331. #Това е начина на работа на тубата. Първо предоставя
  332. #m4a, след време прекодира и във webm, но не се знае,
  333. #кога ще го направи. Твърде често се случва по време
  334. #на теглене. Тубата те надушва, че теглиш m4a и бърза
  335. #да ти даде webm. Ако го правиш достатъчно бавно, то
  336. #той ще те изпревари. А точно това се случва при бавна
  337. #връзка. Ако канала и видеото са непопулярни, то може
  338. #и никога да не се прекодират, но Гългъл надушат ли
  339. #те, веднага се правят на отзивчиви. Тогава имаш едно
  340. #пропиляно време и едни разхвърляни остатъци по диска
  341. #във формата на *.part и *.ytdl, a са възможни, и
  342. #други. Печалбата е, че ако клипа е достатъчно кратък,
  343. #то може да изпревариш тубата и да спестиш време,
  344. #защото m4a е по-малък по размер, ако не е формат
  345. #140. „Риск печели, риск губи“ с Кръстьо Вапцаров.
  346.  
  347.  
  348.  
  349.  
  350.    else
  351. # Тук стигаме, ако се окаже, че нямаме никой от
  352. # търсените формати. Значи трябва да теглим
  353. # звука. Защото винаги първо теглим звука, а това е
  354. # последното разклонение на логиката ни, когато сме
  355. # достигнали: Тогава.
  356.  
  357. ft="599/600/249/250/139/251/140"
  358.  
  359. yar[1]="youtube-dl -f "$ft" $l &"
  360.  
  361.  
  362. echo "tralala 3 $l"
  363. # Това съм си правил някакви изпитания, които са
  364. # изостанали. При крайния код не би съществувало.
  365.  
  366.    fi
  367.    # Изхода от конструкцията Ако.
  368.  
  369.  
  370.  
  371.    if [ -f "$l" ]; then
  372.  
  373. f=$(cat $l)
  374.  
  375.    else
  376.  
  377. f=$(youtube-dl --get-filename -f $ft $l)
  378.  
  379. echo "$f" > $l
  380. touch "$f.part"
  381.  
  382. # Тук използваме страничното действие на touch, ако
  383. # няма *.part да го създаде без съдържание. Ако
  384. # съществува, нищо няма да направи. Но на този етап
  385. # ние нямаме *.part, а наличието му е жизнено важно за
  386. # хака, който ще направим след няколко реда. Логиката
  387. # ни върви обратно. Целта е последна, начина за
  388. # достигане е пръв. Това е основата на всяко
  389. # порномиране.
  390.  
  391.    fi
  392.  
  393.    #  Тази особена конструкция Ако е отново хак с цел
  394.    #  намаляване загубата на време. Как ще се казва бъдещия
  395.    #  документ е отново една много бавна операция, вършена от
  396.    #  външна система, която може и да надвиши пет минути. За
  397.    #  целта минимизираме извикването Ydl. Отново ще запишем
  398.    #  тази информация във временен документ, защото съвсем
  399.    #  скоро ще стане ясно, че се лашкаме между обвивки и си
  400.    #  прехвърляме топката, а ние искаме между тези действия,
  401.    #  тази информация да е достъпна. Както е забелязал Мейк,
  402.    #  името на временния документ ще е идентификатора на
  403.    #  нужното ни видео. Това име ще го ползваме при
  404.    #  сглобяването след малко, за да спестим мъничко
  405.    #  време. Защо? След малко.
  406.  
  407.  
  408.  
  409.  
  410.  
  411.    yar[0]='for i in `seq 1 20`;do if [ -f "'$f'.part" ]; then '
  412.    yar[2]=' sleep 200 && pkill -9 youtube-dl; else rm $0 "'$l'" && ./for & exit ;fi ;done'
  413.  
  414.    # Завършваме сглобяването на масива. Става ясно, защо
  415.    # преди малко попълвахме втория му елемент, а не
  416.    # първия. Това, което правим е нов цикъл. В темата вече
  417.    # споменах, че за Bash e невъзможно да завърти цикъл в
  418.    # цикъл, защото това значи внучеста обвивка, което е
  419.    # невъзможно действие. Единствения друг начин е с goto, но
  420.    # то в Bash не е налично. Има привнесени решения по
  421.    # мрежата, но това усложнява кода, сиреч прави го още
  422.    # по-чуплив. Не е възможно да контролираш средата на
  423.    # изпълнение, затова всеки ред код е потенциална
  424.    # катастрофа. Трябва кода да е възможно най-малко.
  425.  
  426.    # Със заклинанието от първия ред, казваме, че ще въртим
  427.    # двадесет пъти. Помниш, че `` означава изпълнение в
  428.    # подобвивка. Сиреч този код ни казва дай ми: 1, 2, 3
  429.    # ... ,20.
  430.  
  431.    # Тук е и хака за спестяване на време. Възможно е да
  432.    # теглим кратко клипче (грубо под час, час и нещо). Тогава
  433.    # си вкарваме условие, че ако няма наличен
  434.    # *идентификатор.разширение.part, то значи е потеглен и не
  435.    # щем повече да въртим и чакаме по 3 мин. и 20 сек. на
  436.    # врътка.
  437.  
  438.    # Използваме факта, че Ydl по подразбиране си създава
  439.    # *.part за всичко, което тегли в същия каталог, в който
  440.    # се изпълнява. Като чудесен инструмент, той ни позволява
  441.    # настройка на това поведение. Може да налива направо в
  442.    # окончателния документ или пък временния документ да е с
  443.    # друго разположение, а не работния каталог. За нашия
  444.    # случай обаче подразбиращото поведение е
  445.    # предпочитано. Затова Ydl е чудесен. Винаги
  446.    # подразбиращото поведение е най-доброто, но ни дава да
  447.    # настоим всичко по наше предпочитание и нужда.
  448.  
  449.    # Както казах, налага ни се да убиваме Ydl, защото той
  450.    # блокира често и оставаме без нищо в ръцете. Ако
  451.    # скоростта ни беше бърза, то нямаше да се налага да
  452.    # въртим между започване, чакане, убиване, отново (хе-хе,
  453.    # нещо като REPL), но тогава нямаше и да се налага да
  454.    # пишем наш код, защото Ydl може да съединява потоци
  455.    # (стига да не са webm за звук), като сам извиква
  456.    # ffmpeg. FFmpeg има широко приложение в Ydl. Не е само за
  457.    # това. Без FFmpeg, Ydl не би успял да направи и 10% от
  458.    # нещата, които прави.
  459.  
  460.    # На втория ред, след като цикъла от врътки е приключил,
  461.    # връщаме топката във for (сиреч този код), за да прецени,
  462.    # какво е успяло да се изтегли.
  463.  
  464.    # Сигурно го знаеш, но специалната променлива $0 означава
  465.    # името на документа, който изпълняваме. Сиреч с rm $0
  466.    # изриваме боклука, който сме създали.
  467.  
  468.  
  469.    echo ${yar[0]}${yar[1]}${yar[2]} > for2
  470.  
  471.    # Наливаме съставения низ в нов временен документ наречен
  472.    # for2. Не го споменах преди, но съм сигурен, че
  473.    # знаеш. Все пак ще спомена. Знака по-голямо (great than
  474.    # или >) значи, че изхода от изпълнението на команда ще се
  475.    # запише в документ, а не на стандартния изход (демек
  476.    # обвивката). Ако са два, ще бъде добавяне. Ако не
  477.    # съществува, ще се създаде. Обаче ние не искаме да
  478.    # добавяме. Ако все още съществува по някаква причина (а
  479.    # не би трябвало), ние заличаваме съдържанието
  480.    # му. По-голямо е наш отчаян опит да контролираме
  481.    # неконтрилируема среда. Това е причината и за сетен път
  482.    # го казвам, всеки код, който прави какво да е, трябва да
  483.    # е максимално кратък и да се изпълнява максимално бързо,
  484.    # за да намаляваме доколкото е възможно рисковете на
  485.    # обкръжението ни, а те по никакъв начин не зависят от
  486.    # нас.
  487.  
  488.    echo "Download..."
  489.    # Следва най-бавната задача по потегляне на нещо, какво да
  490.    # е, та е редно да го съобщим на потребителя, въпреки, че
  491.    # самия Ydl е предостатъчно приказлив.
  492.  
  493.  
  494.  
  495.    sh for2 &
  496.    echo "bibi  $l"
  497.    exit
  498.  
  499.    # Изпълняваме туко що създадения от нас for2. За да
  500.    # избегнем усложняване в кода (съответно възможни
  501.    # катастрофи), не сме го чесали с chmod +x, а директно го
  502.    # подаваме на sh. Кода вътре е най-простия и краткия
  503.    # възможен, затова е по силите и на обикновения sh.
  504.  
  505.    # С exit спираме по-нататъшно изпълнение. На този етап то
  506.    # вече не е необходимо. Прехвърлили сме работата на
  507.    # друг. Онова „bibi“ e било проверка, какво ме проваля и
  508.    # не би съществувало в окончателния вариант на кода.
  509.  
  510.  
  511.  
  512.  
  513. fi
  514.  
  515.    fi
  516.  
  517.  
  518. done < oti2
  519. # Свършили са всички редове в oti2 и излизаме благополучно от
  520. # Докато. Идеята на по-малко е логично да е обратната на по-голямо,
  521. # което вече обсъдихме преди малко.
  522.  
  523.  
  524.  
  525. rm  oti2
  526. # Почистваме.
  527.  
  528. echo "Done!"
  529. #Казваме на потребителя да си отдъхне. Всъщност го лъжем. Той те първа
  530. #ще види, какви сме ги свършили и изобщо има ли резултат.
  531.  
  532.  
  533. exit
  534. # Казваме на обвивката да се самоубие без грешка. По принцип не е
  535. # необходимо. Bash така или иначе ще излезе от изпълнение след и
  536. # последния ред на документа, ама ей тъй за добре свършена
  537. # работа. Мърлявщината не е качество, което е за поощрение.
« Последна редакция: Apr 13, 2020, 14:11 от go_fire »
Активен

В $por4e2 e истината  ;)

***

Aко даваха стипендия за най-глупави, щях да съм човека с най-много Mини Kупъри

***

Reborn since 1998 || 15.09.2007 totally М$ free && conscience clear

go_fire

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 8780
  • Distribution: Дебиан Сид
  • Window Manager: ROX-Desktop / е17
  • кашик с гранатомет в танково поделение
    • Профил
    • WWW

...


За този манифест съм го виждал, но понеже не знам, точно какво прави, не го ползвам. Броя за опити е когато служителя (server) те реже. Тук имаме увисване на клиента. Това с „нормата“ предполагам лъже услуги. Има такива, които се правят на умни като Pornhub, Soundcloud и други, които отначало ти пускат пълна скорост за няколко секунди от съединението, а после ти дават само, колкото да се изтеглят следващите няколко секунди. Идеята е да имаш намален трафик и при теб да е налично съвсем малко повече от това, което вече си видял.
Активен

В $por4e2 e истината  ;)

***

Aко даваха стипендия за най-глупави, щях да съм човека с най-много Mини Kупъри

***

Reborn since 1998 || 15.09.2007 totally М$ free && conscience clear

remotexx

  • Напреднали
  • *****
  • Публикации: 3210
    • Профил
Гого не разбирам що го цепиш на по няколко реда и не ги ползваш, добър подход кофти имплементация
напр. (защо е кофти)
Код
GeSHi (Bash):
  1. y=$(youtube-dl --get-id -a oti)
  2. echo "$y" > "oti2"
  3. touch -d "$(date -R -r oti)" oti2
не е ли по-лесно така
Код
GeSHi (Bash):
  1. youtube-dl --get-id -a oti > oti2
  2. touch -d "$(date -R -r oti)" oti2

напр. (защо е добре)
Код
GeSHi (Bash):
  1. y=$(youtube-dl --get-id -a oti)
  2.  
  3. rc=$?;
  4. if [ $rc -ne 0 ]; then
  5.  echo "Error"
  6.  exit $rc
  7. fi
  8.  
  9. echo "$y" > "oti2"
  10. touch -d "$(date -R -r oti)" oti2

щото твойто не проверява за грешка, винаги създава oti2 (може и празен), и винаги му шляпва същата дата като oti - независмо дали е успяло да обработи целия oti или е гръмнало с грешка (още отначало или по средата) - напр. кофти URL нейде по средата (ред дето не е коментар нито празен и y2dl ще се опита да обработи и ще се провали)

напр. втория (средния) линк който си дал там (от трите за тестване) вече не съществува и ти проваля свалянето и на последния който е валиден щото фърля следната грешка дето няма кой да я сайдиса
Код
GeSHi (Bash):
  1. WARNING: Unable to extract video title
  2. WARNING: unable to extract description; please report this issue on https://yt-dl.org/bug . Make sure you are using the latest version; see  https://yt-dl.org/update  on how to update. Be sure to call youtube-dl with the --verbose flag and include its complete output.
  3. ERROR: This video is no longer available due to a copyright claim by Anze Kacafura.


При мен си работи правилно - олекотената версия
Код
GeSHi (Bash):
  1. #!/bin/bash
  2.  
  3. unset l
  4.  
  5. youtube-dl --get-id -a oti > oti2
  6. while read -r l;
  7. do
  8. echo "$l e super";
  9. done < oti2

Код
GeSHi (Bash):
  1. Fedora release 31 (Thirty One)
  2. GNU bash, version 5.0.11(1)-release (x86_64-redhat-linux-gnu)
  3.  
  4. [user@host0 oti]$ ./gogo.bash
  5. udGtY2bmTxs e super
  6. tjUBP9m3M5E e super
  7. udGtY2bmTxs e super

Некой забележки
1) ';' не е задължително - освен ако няма да слагаш по повече от един оператор на ред (и край на ред върши същата работа)
2) препоръчително е да се ползва "${l}" вместо "$l" ..кой знае къде из тия фермани има нещо което се прихваща като "$l" неправилно и ти яде символите...

https://stackoverflow.com/questions/8748831/when-do-we-need-curly-braces-around-shell-variables
https://unix.stackexchange.com/questions/4899/var-vs-var-and-to-quote-or-not-to-quote

П.П. и друг(ия) път като знеш колко е нефелен сайта моля ограничавай се до 80 (че и по малко) символи на ред, особено на коментарите, че сега трябва да превъртам, 3 дена път с камили, надолу да стигна хоризонталния скролер да превъртам надясно (екран по екран), после пак нагоре до коментара, после пак надолу до скорлера и т.н. докато чета ферман на един ред и после отиваме до началото на следащия ред/коментар и пак се почва сагата отначало  :P
П.П.П. Знам че има Shift+ScrollWheel ама ми умаля пръста - особ. при връщане от 1024 символ обратно в началото на следващия ред, особено като си помисля че той може и да е 2048 символа и ..да ти се отще (да превърташ)
Еххх ако мишките имаха километраж ...сигур щяхме да си ги мерим на километри  ;D
« Последна редакция: Mar 28, 2020, 18:58 от remotexx »
Активен

go_fire

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 8780
  • Distribution: Дебиан Сид
  • Window Manager: ROX-Desktop / е17
  • кашик с гранатомет в танково поделение
    • Профил
    • WWW
Благодаря, Ремо! Естествено, че си прав. Пресъздаването ми в код е кофти, защото и аз като 4096 не съм програмист и нямам нужния опит. Естествено, че твоя вариант е по-добър от моя, но няма кой да се сети. Руснаците на това моето му казват говно-код.

Днес се сетих, защо нещото не е сработило при Мейк ми. Не съм уточнил, че така написано, е задължително да има две неща. Едното е oti (списък), а другото for (този код). По принцип е трябвало (а сигурно съм го и мислел) да заменя имената им с $1 и $0, но съм ги нахакал твърдо и така, ако едното липсва, кода не работи.

По двете препоръки. Първата, точката и запетаята е задължителна, защото всичко, което набирам в yar накрая ще е само един ред във for2. Това реално е нещото, което ползвам и до сега. Просто исках да го автоматизирам.

По втората. Много съм тъп и не разбрах защо {l}. Ще ходя да се образовам по връзките, дето си дал, че да разбера, каква свинщина съм свършил.
Активен

В $por4e2 e истината  ;)

***

Aко даваха стипендия за най-глупави, щях да съм човека с най-много Mини Kупъри

***

Reborn since 1998 || 15.09.2007 totally М$ free && conscience clear

go_fire

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 8780
  • Distribution: Дебиан Сид
  • Window Manager: ROX-Desktop / е17
  • кашик с гранатомет в танково поделение
    • Профил
    • WWW
По послеписа. Просто го хвани и го сложи в текстов редактор. Тъпото е, че още в първия, та втория ли коментар казвам, че това трябва да се прави, но не съм го направил :(

ЛАМЕР У-У-У-У-У-У-У-У-У!!!

п.п. Наистина не знаех, че форума ще го направи :( Много съм тъп.

п.п.п. А бе, още от деветдесетте имаше програмки, дето ти мереха километража. А в ГНУ/Линукс такава програмка мисля, че е десетина реда.
« Последна редакция: Mar 28, 2020, 19:08 от go_fire »
Активен

В $por4e2 e истината  ;)

***

Aко даваха стипендия за най-глупави, щях да съм човека с най-много Mини Kупъри

***

Reborn since 1998 || 15.09.2007 totally М$ free && conscience clear

go_fire

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 8780
  • Distribution: Дебиан Сид
  • Window Manager: ROX-Desktop / е17
  • кашик с гранатомет в танково поделение
    • Профил
    • WWW
Аз в действителност не гледам набиращите популярност. Просто ги използвах за пример. Например последното, което теглих е предаването на Диков от снощи. А то обикновено няма повече от хиляда гледания. Сега те първа ще го слушам. И преди съм казвал, че тегля обикновено само звук, защото това ми позволява да съм почти в реално време. Няма го вече 3gp за картинка. Този код тук е за специалните случаи (много редки), когато държа да има и картинка и евентуално ще си го и запазя това клипче, а няма да го трия веднага.

п.п. МНОГО БЛАГОДАРЯ за включванията ти и на всички останали!
Активен

В $por4e2 e истината  ;)

***

Aко даваха стипендия за най-глупави, щях да съм човека с най-много Mини Kупъри

***

Reborn since 1998 || 15.09.2007 totally М$ free && conscience clear

remotexx

  • Напреднали
  • *****
  • Публикации: 3210
    • Профил
Гога, извинявай че ти дадох отг. в стил Сисадмин (от близкото минало) " Не знам - при мен работи". То изначално е ясно, че за супер потребителя работи (винаги), а обикновените потребители "да го духат" или да се спасяват сами - стар принцип останал още от римско време:

http://bezistena.blog.bg/history/2019/03/30/da-go-duhat-bednite-kategorichni-sa-rimskite-senatori.1651155

и понеже сме на тема Ю тубата - https://www.youtube.com/watch?v=79V5YIqkHyc

но така на прима виста и без валиден тест, мога само да нахвърлям някой идеи да тестваш (за заобикаляне на проблема)
1. Не каза при тебе моя олекотения вариант дали работи - ако работи може да продължиш да си търсиш грешката по ферманите, ако ли не... виж другите идеи

2. Ако е некой бъг що не пробваш клaсическия вариант - през IFS (ако е нещо от whitespace)
 https://www.cyberciti.biz/faq/unix-howto-read-line-by-line-from-file/
https://bash.cyberciti.biz/guide/$IFS

3. for loop - понеже ИДтата са ти по една дума (на ред) долното би трябвало да сработи та барем разберем while/read ли е виновен или НЕ
Код
GeSHi (Bash):
  1. for word in $(cat ./oti); do echo $word; done


П.П. пробвай по-лесните варианти и кажи при теб кое сработва и кое не...
няма как ще трябва да те ползвам(е) като remote debugger понеже нямаме repeatable test case  :o


П.П.П. Копиране/поставяне в текстов файл е добра идея ...ако си на десктоп, ма с тея телефони, кой ти сяда вече на десктопа ...голямо превъртане падна ..докато не се сетих да си направя опростен вариант - който обаче за моя изненада при мен сработи правилно?! youtube-dl обновен ли ти е до последно?
« Последна редакция: Mar 28, 2020, 20:09 от remotexx »
Активен

remotexx

  • Напреднали
  • *****
  • Публикации: 3210
    • Профил
и някой др. подводни капани - напр. ако последния ред не всършва с НовРед и пр. (макар че тогава ще ти изяде последния ред - целия, а не по 1 символ на ред)

като цяло е доста образоващо за ролята и обхавата на IFS - кога рябва да се запазва и въстановява и кога е само в контекста на текущия цикъл (while)

Виж отг. на codeforester  answered Jan 14 '17 at 3:30
https://stackoverflow.com/questions/1521462/looping-through-the-content-of-a-file-in-bash


Активен

4096bits

  • Напреднали
  • *****
  • Публикации: 6152
    • Профил
Така...

Не ми става ясно, какъв документ while -r l; чете и откъде се взима ( как му е посочен )

Иначе си поиграх малко и до четенето на oti, свалянето на IDтата и уеднаквяването на mtime се докара.
Защо предпочитам Питоня вместо баш... Можеш да вършиш няколко неща едновременно ( паралелно ), като например да напускаш наведнъж да се вземат няколко IDта.

Ето и нещото, допреди да запецна поради горната причина.
Код:
#!/usr/bin/env python3
# This software is under the MIT License: https://opensource.org/licenses/MIT
#


import concurrent.futures as cf
import os
import os.path
import subprocess as sp

def get_dw_link(oti_path):
    with open(oti_path) as oti:
        for line in oti:
            # Просто проверява, ако реда започва като линк за гледане на видео от Youtube
            # и игнорира всичко останало
            if line.startswith('https://www.youtube.com/watch?v='):
                yield line.split()[0]


def get_id(url):
    try:
        # Тук може да се сложи timeout като аргумент в секунди
        # Може да бъде и израз 10*60 става 10 минути. Или пък 10*60+15
        resp = sp.run(['youtube-dl', '--get-id', url],
                    capture_output=True,
                    text=True)
       
        if resp.returncode == 0:
            return resp.stdout
        else:
            print(f'Getting ID failed! Skipped: "{url}". Return code: {resp.returncode}')
           
    except sp.TimeoutExpired:
        print(f'Timeout! Subprocess: {" ".join(resp.args)}. Skipped!')
       
                                     
def get_ids():
    with open('oti2', 'w') as oti2:
        with cf.ThreadPoolExecutor() as executor:
            ids = [executor.submit(get_id, url) for url in get_dw_link('oti')]
           
            for video_id in cf.as_completed(ids):
                if video_id.result():
                    oti2.write(video_id.result())
       


mt_oti = os.stat('oti').st_mtime

# Ако не съществува или mtime му е различен от този на oti
if not os.path.exists('oti2') or os.stat('oti2').st_mtime != mt_oti:
    get_ids()
   
    at_oti2 = os.stat('oti2').st_atime
   
    # За да се промени mtime на файла трябва да се зададат и двете atime и mtime. Не питай защо. Не зная.
    os.utime('oti2', (at_oti2, mt_oti))
   
else:
    pass
   
### Вторият ред е шегичка
Активен

As they say in Mexico, "Dasvidaniya!" Down there, that's two vidaniyas.

go_fire

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 8780
  • Distribution: Дебиан Сид
  • Window Manager: ROX-Desktop / е17
  • кашик с гранатомет в танково поделение
    • Профил
    • WWW
Remo, a защо като си на телефон не ползваш мобилните версии на форума и портала? Макар точно в този случай да е безполезно :'( :'( :'(

https://www.linux-bg.org/forum/index.php?topic=48741.15;wap2
Активен

В $por4e2 e истината  ;)

***

Aко даваха стипендия за най-глупави, щях да съм човека с най-много Mини Kупъри

***

Reborn since 1998 || 15.09.2007 totally М$ free && conscience clear

4096bits

  • Напреднали
  • *****
  • Публикации: 6152
    • Профил
Впрочем, може на oti2 да му се вдигне i флага, за да не може да се променя случайно нещо по него
Активен

As they say in Mexico, "Dasvidaniya!" Down there, that's two vidaniyas.

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
bash срипт за местене на файлове
Общ форум
nov_chovek 3 2090 Последна публикация Oct 27, 2009, 16:17
от radoulov
Bash - взимане на няколко реда от средата на текст файл
Общ форум
PhrozenCrew 7 2128 Последна публикация Dec 04, 2009, 15:35
от radoulov
bash проблемче
Общ форум
asp 3 2112 Последна публикация Jun 21, 2010, 19:13
от asp
Питанка за bash скрипт
Общ форум
p1k0 9 2707 Последна публикация Sep 05, 2010, 02:47
от neter
bash + php
Общ форум
mrowcp 5 2153 Последна публикация Sep 06, 2010, 17:23
от neter