Bashov skript - kde je chyba?

Bashov skript - kde je chyba?
« kdy: 15. 03. 2011, 01:36:00 »
Kód: [Vybrat]
#!/bin/bash

zapis="./zapis.txt";
zapisOld="./zapisOld.txt";
zapisBackUp="./zapisBackUp.txt";


if [ -e "$zapis" ]
  then
   cp $zapis $zapisOld
   rm $zapis
fi

pripony=( avi mkv mp4 wmv divx mpg mpeg )

for ((i=0;i<7;i++))
do

 if [ -e "$zapis" ]
  then
   ls *.${pripony[$i]} >> $zapis 2>/dev/null
  else ls *.${pripony[$i]} > $zapis 2>/dev/null
 fi

done

while read line   
do

#  sh ~/Dokumenty/ScriptyBASH/vcs-1.12.2.sh -n 21 -c 3 -H160 "$line"
  sleep 1s
  echo $line

done <$zapis

cp $zapis $zapisBackUp
rm $zapis
V sekundových intervalech vypisuje jednotlivé řádky ze souboru co si vytvoří, ale když to změním takhle:

Kód: [Vybrat]
...
  sh ~/Dokumenty/ScriptyBASH/vcs-1.12.2.sh -n 21 -c 3 -H160 "$line"
  sleep 1s
#  echo $line
...
spustí se mi daný program jen jednou
« Poslední změna: 15. 03. 2011, 09:39:37 od Petr Krčmář »


Kit

Re: bashový script - kde je chyba?
« Odpověď #1 kdy: 15. 03. 2011, 06:59:58 »
Nějak nechápu, proč to děláš tak složitě. Zkusím to trochu zjednodušit:
Kód: [Vybrat]
#!/bin/bash

zapis="./zapis.txt";
zapisOld="./zapisOld.txt";
zapisBackUp="./zapisBackUp.txt";

mv "$zapis" "$zapisOld" 2>/dev/null

find . -maxdepth 1 -iname "*.avi" \
  -or -iname "*.mkv" \
  -or -iname "*.mp4" \
  -or -iname "*.wmv" \
  -or -iname "*.divx" \
  -or -iname "*.mpg" \
  -or -iname "*.mpeg" >"$zapis"

while read line; do
  sh $HOME/Dokumenty/ScriptyBASH/vcs-1.12.2.sh -n 21 -c 3 -H160 "$line"
  sleep 1s
done <"$zapis"

mv "$zapis" "$zapisBackUp" 2>/dev/null

Tohle by mělo fungovat. Proč vlastně vytváříš ty pracovní soubory? Jde to i bez nich.

Re: bashový script - kde je chyba?
« Odpověď #2 kdy: 15. 03. 2011, 09:22:00 »
Prvni skript je v bashi a druhy je v cem? Volas tam 'sh', ja bych typoval ze tam taky chces volat 'bash'. Ten shell skript .sh to tedy provede jen jednou? Jaka je navratova hodnota? Co ten skript dela? Provede ho to do konce nebo jen z casti?

Podle me to vypada ze ten skript vrati nenulovou navratovou hodnotu a to tvuj skript ukonci, chtelo by to tohle ve tvem skriptu zakazat, ale ja to umim jen zapnout (set -e), nevim jak to vypnout.

Jinak pro debug doporucuju hned na zacatku bash skriptu napsat 'set -x', hezky to vypisuje ktere prikazy se zrovna provadi.



ams

Re: Bashov skript - kde je chyba?
« Odpověď #3 kdy: 15. 03. 2011, 11:06:16 »
Mam podezreni, ze problem je podobny tomuto: http://www.abclinuxu.cz/poradna/programovani/show/330284
Zkuste presmerovat stdin na /dev/null:
sh $HOME/Dokumenty/ScriptyBASH/vcs-1.12.2.sh -n 21 -c 3 -H160 "$line" < /dev/null

Re: Bashov skript - kde je chyba?
« Odpověď #4 kdy: 15. 03. 2011, 13:03:34 »
Nějak nechápu, proč to děláš tak složitě. Zkusím to trochu zjednodušit:
...
Tohle by mělo fungovat. Proč vlastně vytváříš ty pracovní soubory? Jde to i bez nich.
zjednodušení je fajn a funguje stejně  :) - bohužel z nějakého mě neznámého důvodu načítá pouze první řádek - když zakomentuju řádek s sh příkazem a napíšu místo toho "vypsat řádek", tak vypíše všechny

začal jsem s tím takhle.

jednou z možností bylo, zkopírovat ten cyklus mnohokrát, pro každou příponu, což jsem si ale říkal, že to musí jít jinak lépe. Nepodařilo se mi s tím vypořádat bez pracovního souboru (potíže s mezerama), tak to zkouším takhle.
Prvni skript je v bashi a druhy je v cem? Volas tam 'sh', ja bych typoval ze tam taky chces volat 'bash'. Ten shell skript .sh to tedy provede jen jednou? Jaka je navratova hodnota? Co ten skript dela? Provede ho to do konce nebo jen z casti?

Podle me to vypada ze ten skript vrati nenulovou navratovou hodnotu a to tvuj skript ukonci, chtelo by to tohle ve tvem skriptu zakazat, ale ja to umim jen zapnout (set -e), nevim jak to vypnout.

Jinak pro debug doporucuju hned na zacatku bash skriptu napsat 'set -x', hezky to vypisuje ktere prikazy se zrovna provadi.
ten script mi poradili tady
chceš-li můžeš se na něj podívat tady

ale i tak, druhý script volá #!/usr/bin/env bash
a výpis se set -x:
Kód: [Vybrat]
miki@ip-94-113-122-100:/Disks/Sdb/Videa> sh ~/Dokumenty/ScriptyBASH/pokus.sh
+ zapis=./zapis.txt
+ zapisOld=./zapisOld.txt
+ zapisBackUp=./zapisBackUp.txt
+ '[' -e ./zapis.txt ']'
+ find . -maxdepth 1 -iname '*.avi' -or -iname '*.mkv' -or -iname '*.mp4' -or -iname '*.wmv' -or -iname '*.divx' -or -iname '*.mpg' -or -iname '*.mpeg'
+ read line
+ sh /home/miki/Dokumenty/ScriptyBASH/vcs-1.12.2.sh -n 21 -c 3 -H160 './video.mkv'
Video Contact Sheet *NIX v1.12.2, (c) 2007-2010 Toni Corvera
Processing ./video.mkv...
Detected video length can't be reached. Safe measuring enabled.
Starting safe length measuring (this might take a while)...
   ... trying 293.579
Capturing in range [00:13.21-04:37.43]. Total length: 04:53.58
Generating capture #1/21 (00:13.21)...
Very small timestamps in use. Disabling them with -dt might be preferable
Generating capture #2/21 (00:26.42)...
...
Generating capture #21/21 (04:37.43)...
Composing standard contact sheet...
Adding header and footer...
Done. Output wrote to video.mkv-2.png
Cleaning up...
+ sleep 1s
+ read line
+ mv ./zapis.txt ./zapisBackUp.txt

Á zatímco píšu:

Mam podezreni, ze problem je podobny tomuto: http://www.abclinuxu.cz/poradna/programovani/show/330284
Zkuste presmerovat stdin na /dev/null:
sh $HOME/Dokumenty/ScriptyBASH/vcs-1.12.2.sh -n 21 -c 3 -H160 "$line" < /dev/null
je to trochu zvláštní, ale je to tak - no faktem je, že ten vcs script ke své práci volá ffmpeg, nebo mplayer
« Poslední změna: 15. 03. 2011, 13:11:49 od Michal Švarc »


Re: Bashov skript - kde je chyba?
« Odpověď #5 kdy: 15. 03. 2011, 18:46:28 »
To je teda zajimavy ze to pomohlo, nechapu proc by volany skript v cyklu mel vycist vsechny data z stdin ... :)

No jinak jsem si vsiml jeste jedne veci, to ls *.cokoli na mym stroji vypisuje soubory do nekolika sloupcu vedle sebe, tudiz 1 radek ma vic souboru a neni mozne takovyto vypis cist pres WHILE READ LINE. Ja musim dat ls -1 *.cokoli, aby to psalo kazdy soubor na novy radek, nebo pouzit find.

Re: Bashov skript - kde je chyba?
« Odpověď #6 kdy: 15. 03. 2011, 18:56:29 »
V posledni rade, pokud je jenom nutne vzit seznam souboru a zavolat na nej ten skript, pak se cele to bashovske dlouhe povidani da zkratit na neco jako tohle:

Kód: [Vybrat]
#!/bin/bash

find  -regextype posix-egrep -iregex ".*[.](avi|mkv|mp4|wmv|divx|mpg|mpeg)" \
      -exec sh $HOME/Dokumenty/ScriptyBASH/vcs-1.12.2.sh -n 21 -c 3 -H160 '{}' \;

To je cele. Otestoval jsem to, funguje to :) Pokud nechces prohledavat podadresare, jeste musis pridat jako parametr pro find neco jako -maxdepth 1
« Poslední změna: 15. 03. 2011, 19:04:49 od Tomas Matejicek »

Re: Bashov skript - kde je chyba?
« Odpověď #7 kdy: 17. 03. 2011, 01:04:58 »
No jinak jsem si vsiml jeste jedne veci, to ls *.cokoli na mym stroji vypisuje soubory do nekolika sloupcu vedle sebe, ... nebo pouzit find
ano ls vypisuje do více sloupců, ale když zadáš ls > ls.txt , tak v tom souboru budou každý na novém řádku
ano, find je podle všeho lepší volbou, jistý 'Thomas M' tu dokonce psal cosi o nefukčnosti pro enormní počty souborů

Kód: [Vybrat]
#!/bin/bash

find  -regextype posix-egrep -iregex ".*[.](avi|mkv|mp4|wmv|divx|mpg|mpeg)" \
      -exec sh $HOME/Dokumenty/ScriptyBASH/vcs-1.12.2.sh -n 21 -c 3 -H160 '{}' \;
Tak na tohle zírám a nedostává se mi slov. Díky
« Poslední změna: 17. 03. 2011, 08:09:50 od Michal Švarc »

Tomas M

Re: Bashov skript - kde je chyba?
« Odpověď #8 kdy: 17. 03. 2011, 15:04:02 »
ano, find je podle všeho lepší volbou, jistý 'Thomas M' tu dokonce psal cosi o nefukčnosti pro enormní počty souborů
ohle zírám a nedostává se mi slov. Díky
No to sem byl taky ja, a je to pravda, shell expansion neni vsemocny, pro univerzalnost je lepsi ls *.neco vubec nepouzivat.