Fórum Ubuntu CZ/SK

Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: rejže 18 Května 2016, 16:31:42

Název: script pro vysavač
Přispěvatel: rejže 18 Května 2016, 16:31:42
Zdravím. Zjistil jsem,že náš robotický vysavač běží na linuxu a lze upravovat parametry pomocí jednoduchých scriptů.
Kód: [Vybrat]
#!/bin/sh
#IS_HIT_UPDATE_SCRIPT=1

SOURCE_PATH="/mnt/usb"
 
# Pocitani robota 1-3
aplay -c 1 -r 16000 -f S16_LE /usr/SNDDATA/SND_NUM_1.snd
aplay -c 1 -r 16000 -f S16_LE /usr/SNDDATA/SND_NUM_2.snd
aplay -c 1 -r 16000 -f S16_LE /usr/SNDDATA/SND_NUM_3.snd

# Kopirovani novych paramteru do robota
cp "$SOURCE_PATH"/SND_CLEANING_ZIGZAG.snd /usr/SNDDATA/SND_CLEANING_ZIGZAG.snd
 
# Pocitani robota 3-1
aplay -c 1 -r 16000 -f S16_LE /usr/SNDDATA/SND_NUM_3.snd
aplay -c 1 -r 16000 -f S16_LE /usr/SNDDATA/SND_NUM_2.snd
aplay -c 1 -r 16000 -f S16_LE /usr/SNDDATA/SND_NUM_1.snd
 
exit
tento náhrada zvuku za vlastní. Bohužel je pro jiný soubor nutné přepisovat script zvlášť a tak jsem se pustil do univerzálního a zasekl jsem se na proměnných,které nedělají co bych čekal.
Můj script
Kód: [Vybrat]
#!/bin/sh
#IS_HIT_UPDATE_SCRIPT=1

#Zjistí vkládaný soubor
FILE=$(ls -F | grep -v / | grep -v sh);
echo $FILE
#zjistí cestu k původnímu
cd ./usr
CESTA= find | grep -i $FILE
echo ${CESTA}
#cd ..
#zkopíruuje soubor do umístění
cp -f ../${FILE} ${CESTA} #nezkopíruje chybí název cílového souboru
cp -f ../${FILE} ./SNDDATA/find.txt #zkopíruje
exit 0
Proměnná CESTA ale při tom obsahuje totéž,tedy ./SNDDATA/find.txt  find.txt je soubor,který se snažím kopírovat.
pro úplnost výpis z konzole.
Kód: [Vybrat]
tomas@tomas-Ubuntu:~/Stažené/vysavac/backup$ ./uniupdate.sh
find.txt
./SNDDATA/find.txt
Poradí prosím někdo? Díky
Název: Re:script pro vysavač
Přispěvatel: ntz_reloaded 18 Května 2016, 18:16:28
to mas spatne cele .. nechapu presne ceho snazis docilit, ale v tom skriptu je v podstate spatne kazdej radek takze tezko rict ...

snad jen ze

``neco= nejakej_prikaz'' rozhodne nepriradi do te promenne vystup z toho prikazu, eg v tom tvem vystupu je `find.txt' vystup primo echo $FILE a ten dalsi radek vystup rovnou z find, protoze CESTA je logicky prazdna

prosim pouzivej na zacatku skriptu debug mod abys chapal co to dela ... to se dela pomoci set -x ... potom to bude vypisovat podrobnej trace ... kdyz pouzijes:

exec 2>/tmp/$(basename $0).debug
set -x


tak to bude lejt ten vystup do souboru (viz vyse - je to priklad, muzes tam napsat treba samozrejme /tmp/fuj a vystup bude v /tmp/fuj)
Název: Re:script pro vysavač
Přispěvatel: rejže 18 Května 2016, 19:32:05
při update vysavače je v kořeni flashky soubor kterým chci nahradit ten původní ve vysavači. Viz první skript,kde je pouhé kopírování s pevně daným souborem a pevně danou cestou kam ten soubor patří. Chci docílit  toho aby update skript přečetl název souboru,který je s ním na té flashce,našel ho v systému vysavače a nahradil. Po opravě,že mě to netrklo hned,už to funguje jak má.
Kód: [Vybrat]
#!/bin/sh
#IS_HIT_UPDATE_SCRIPT=1

#Zjistí vkládaný soubor
FILE=$(ls -F | grep -v / | grep -v sh);
echo $FILE
#zjistí cestu k původnímu
cd ./usr
CESTA=$(find | grep -i $FILE);#opravený řádek
echo ${CESTA}
#cd ..
#zkopíruuje soubor do umístění
cp -f ../${FILE} ${CESTA}
exit 0

Ještě musím zkusit ošetřit,když nebude soubor nalezen a přidat zvukové hlášky zda to proběhlo dobře,nebo s chybou. Jiná zpětná vazba než hlasový výstup to nemá.
Každopádně dík za upozornění,že CESTA je prázdná.
Název: Re:script pro vysavač
Přispěvatel: Jakub Vaněk 18 Května 2016, 19:34:03
Něco se mi podařilo spatlat. :D Je to teda předělané, ale funguje to.
Kód: [Vybrat]
#!/bin/sh
#IS_HIT_UPDATE_SCRIPT=1

find . -maxdepth 1 -type f -not -regex '.*\.sh' | sed 's|^\./||' | while read SRC # find new files
do # for each file
  echo "source file: $SRC"
  DST=$(find ./usr -name "$SRC" | head -n 1) # where to copy the file
  if [ "$DST" = "" ]; then # old file not found
    echo "no destination found!"
    continue # go to next file
  fi
  echo "destination file: $DST"
  cp -f "./${SRC}" "${DST}" # copy the new file over the old file
done

exit 0
Vysvětlení:
Kód: [Vybrat]
find . -maxdepth 1 -type f -not -regex '.*\.sh' | sed 's|^\./||' | while read SRC
Kód: [Vybrat]
DST=$(find ./usr -name "$SRC" | head -n 1)Tohle najde soubor ve složce usr, co se jmenuje stejně jako vyhledaný soubor. Vezme jenom první nalezený.
Zbytek by měl být jasný.
Název: Re:script pro vysavač
Přispěvatel: rejže 18 Května 2016, 20:48:00
To vypadá zajímavě. Určitě zkusim,když je tam ošetřená chyba. Jinak jsem zjistil,že má v sobě i ovladač pro wifi dongle a na německým fóru jsem našel návod jak to zprovoznit. Zítra má manželka ten vysavač dostat k narozeninám,tak jsem ho naučil se představit a popřát jí všechno nejlepší.  ;) No zjistil jsem,že to bude nakonec hračka i pro mě.
EDIT: Je to super,jelikož to zvládne i víc souborů,ale soubory s koncovkou .sh to nevynechává. Zkouším najít proč,ale zatím nic.
EDIT: Tak jsem na to přišel
Kód: [Vybrat]
find . -maxdepth 1 -type f -not -regex '.*\.sh' | sed 's|^\./||' | while read SRC
Kód: [Vybrat]
find . -maxdepth 1 -type f -not -iregex '.*\.sh' | sed 's|^\./||' | while read SRCZatím to mám vyzkoušený na kompu na kopii souborů z vysavače. Ještě to musím upravit,protože ve skriptech pro vysavač se ukládá proměnná SOURCE_PATH="/mnt/usb" ,ale to už snad bude dobrý. Jestli umí luxík všechny příkazy co v tom skriptu jsou,tak půjde šmahem vyměnit několik hlasových souborů najednou.
Ještě jednou díky.
Název: Re:script pro vysavač
Přispěvatel: Petr Merlin Vaněček 18 Května 2016, 21:55:32
Teda ... tohle je zajímavé vlákno ... :D :D :D
Trochu mi to připomíná, když syn dostal mašinky ... chjo, jsem si hrál do 4 do rána ...
Název: Re:script pro vysavač
Přispěvatel: Jakub Vaněk 18 Května 2016, 22:29:48
EDIT: Je to super,jelikož to zvládne i víc souborů,ale soubory s koncovkou .sh to nevynechává. Zkouším najít proč,ale zatím nic.
To je divný, mně (už spím) to normálně funguje. Možná nějaká nekompatibilita? Mně funguje i s busyboxovou verzí findu.
Kód: [Vybrat]
$ find
.
./test.sh
./usr
./usr/hahaha
./usr/hahaha/c.txt
./usr/a.txt
./usr/a.sh
./b.txt
./hahaha
./a.txt
./c.txt
./a.sh
$ ./test.sh
source file: b.txt
no destination found!
source file: a.txt
destination file: ./usr/a.txt
source file: c.txt
destination file: ./usr/hahaha/c.txt
Zítra se na to podívám.
Ten vysavač mi připomíná moje aktuální hraní s dronem... dostal jsem sice jednou malého linuxového drona jako dárek, ale nemám mobil s Androidem (tenkrát jsem měl) a BLE (to už tenkrát ne, ale má ho spolužák :D ) a tak jsem náhodou našel jak programovat v céčku přímo drona pomocí oficiálního vzdělávacího firmware (https://github.com/Parrot-Developers/RollingSpiderEdu). Kam se hrabou některé jiné zájmové aktivity... Zatím naštěstí nikdo nezemřel a nikdo jiný než já nebyl zraněn :D
Název: Re:script pro vysavač
Přispěvatel: rejže 18 Května 2016, 23:08:34
Už mi to funguje,ale musel jsem dát -iregex.
Název: Re:script pro vysavač
Přispěvatel: rejže 19 Května 2016, 23:46:34
Je podarovano a musím říct,že přání k narozeninám od vysavače zapůsobilo. Já jsem zvědav co do něj dostanu za vylepšení.  8)
Název: Re:script pro vysavač
Přispěvatel: rejže 21 Května 2016, 03:27:46
Tak ten zajímavej skript vysavač bohužel nevezme. Asi mu něco chybí v busyboxu. No budu koumat dál a zatim používat ten můj paskvil. Debug log jsem tam dal,takže sem pak dám výpis.
Takže toto mi vyhodí :
Kód: [Vybrat]
+ aplay -c 1 -r 16000 -f S16_LE /usr/SNDDATA/SND_NOTICE_UPDATE_START.snd
Playing raw data '/usr/SNDDATA/SND_NOTICE_UPDATE_START.snd' : Signed 16 bit Little Endian, Rate 16000 Hz, Mono
+ cd /mnt/usb
+ sed 's|^\./||'
+ find . -maxdepth 1 -type f -not -iregex '.*\.sh'
+ read SRC
BusyBox v1.6.1 () multi-call binary

Usage: find [PATH...] [EXPRESSION]

Search for files in a directory hierarchy.  The default PATH is
the current directory; default EXPRESSION is '-print'

EXPRESSION may consist of:
-follow Dereference symlinks
-name PATTERN File name (leading directories removed) matches PATTERN
-print Print (default and assumed)
-print0 Delimit output with null characters rather than
newlines
-type X Filetype matches X (where X is one of: f,d,l,b,c,...)
-perm PERMS Permissions match any of (+NNN); all of (-NNN);
or exactly (NNN)
-mtime DAYS Modified time is greater than (+N); less than (-N);
Or exactly (N) days
-mmin MINS Modified time is greater than (+N); less than (-N);
or exactly (N) minutes
-newer FILE Modified time is more recent than FILE's
-inum N File has inode number N
-exec CMD Execute CMD with all instances of {} replaced by the
files matching EXPRESSION
-user NAME File is owned by user NAME (numeric user ID allowed)
-group NAME File belongs to group NAME (numeric group ID allowed)
-depth Process directory after traversing it
-size N File size is N
-prune Stop traversing current subtree
-path Path matches PATTERN
(EXPR) Group an expression

+ aplay -c 1 -r 16000 -f S16_LE /usr/SNDDATA/SND_NOTICE_UPDATE_END.snd
Playing raw data '/usr/SNDDATA/SND_NOTICE_UPDATE_END.snd' : Signed 16 bit Little Endian, Rate 16000 Hz, Mono
+ exit 0
Zjevně tedy příkazu find v řádku "DST=$(find ./usr -name "$SRC" | head -n 1)" něco chybí. Problém bude v té proměnné. V ubuntu to chodí normálně,ale vysavač to nedá.
Název: Re:script pro vysavač
Přispěvatel: Jakub Vaněk 25 Května 2016, 19:46:25
Zdravím a omlouvám se za pauzu, byl jsem na školním výletě. Příkaz find je v tomhle busyboxu evidentně osekaný – nemá ani regexy. Tohle by mohlo fungovat:
Kód: [Vybrat]
#!/bin/sh

find . ! -name . -prune -type f | sed '/^.*\.sh$/d;s/^\.\///' | while read SRC # find new files
do # for each file
  echo "source file: $SRC"
  DST=$(find ./usr -name "$SRC" | head -n 1) # where to copy the file
  if [ "$DST" = "" ]; then # old file not found
    echo "no destination found!"
    continue # go to next file
  fi
  echo "destination file: $DST"
  cp -f "./${SRC}" "${DST}" # copy the new file over the old file
done

exit 0
Aktualizovaný rozbor:
Kód: [Vybrat]
find . ! -name . -prune -type f | sed '/^.*\.sh$/d;s/^\.\///' | while read SRC # find new filesEDIT: odstranil jsem ten komentář „#IS_HIT_UPDATE_SCRIPT=1“, protože pokud skript nečte nějaký ověřovací automat, není potřeba.
Název: Re:script pro vysavač
Přispěvatel: rejže 26 Května 2016, 01:03:57
Díky. Určitě zkusim. Musim se v tomhle taky trochu dovzdělat. Je to zajímavý, ale chce to dost času. Zatím jsem cvakal jen sledy příkazů, který mi sice vždycky posloužily, ale většinou to nestačí.
Název: Re:script pro vysavač
Přispěvatel: rejže 28 Května 2016, 17:51:46
Tak to neklaplo. předtím jsem zkusil zaměnit tenhle příkaz za ten svůj řádek s příkazem ls a dopadlo to stejně jako teď,tj. nefunguje to a navíc to ani nezapíše debug,takže vůbec nevím proč to nejde. Přijde mi ale,že problém nastane až při druhém find,nebo se nenačte proměnná SRC. Smyčky by ale fungovat měly. Ve skriptech z německých stránek je smyčka FOR. Začal jsem teď studovat tohle: http://www.abclinuxu.cz/clanky/navody/bash-i (http://www.abclinuxu.cz/clanky/navody/bash-i)
tak se snad někam časem posunu.
Název: Re:script pro vysavač
Přispěvatel: Jakub Vaněk 28 Května 2016, 18:42:17
Tak leda že by to bylo tím negačním vykřičníkem u prvního findu. Ten druhý find by měl fungovat.
Tohle je tedy verze s ls místo findu:
Kód: [Vybrat]
#!/bin/sh

ls -AF | sed '/\(\/\|=\||\|>\)$/d;s/\(\*\|@\)$//;/\.sh$/d' | while read SRC # find new files
do # for each file
  echo "source file: $SRC"
  DST=$(find ./usr -name "$SRC" | head -n 1) # where to copy the file
  if [ "$DST" = "" ]; then # old file not found
    echo "no destination found!"
    continue # go to next file
  fi
  echo "destination file: $DST"
  cp -f "./${SRC}" "${DST}" # copy the new file over the old file
done

exit 0
Tohle jsem splácal místo toho:
Kód: [Vybrat]
ls -AF | sed '/\(\/\|=\||\|>\)$/d;s/\(\*\|@\)$//;/\.sh$/d'PS: mě tenhle dotaz taky docela vzdělává, není to tak, že bych předtím nějak extra ovládal sed ;)
Název: Re:script pro vysavač
Přispěvatel: rejže 28 Května 2016, 18:59:05
Tak opět to ani debug nezapsalo. Teď se seznamuji s příkazem "xargs" ,že bych jím zkusil nahradit tu smyčku. Mám pocit,že nude problém tam.
Tady je příklad použití xargs,který vytvoří seznam vybraných souborů z aktuálního adresáře a vloží je do souboru.
Kód: [Vybrat]
find . -maxdepth 1 -type f | grep bas | grep -v zip | sed 's|^\./||' | xargs -i echo {} > ./vysavac/seznam.txt
Název: Re:script pro vysavač
Přispěvatel: Jakub Vaněk 28 Května 2016, 20:52:28
A nevypisuje to nic ani když po shebangu (#!/bin/sh) dáš to set -x?
Kód: [Vybrat]
#!/bin/sh
set -x

ls -AF | sed '/\(\/\|=\||\|>\)$/d;s/\(\*\|@\)$//;/\.sh$/d' | while read SRC # find new files
do # for each file
  echo "source file: $SRC"
  DST=$(find ./usr -name "$SRC" | head -n 1) # where to copy the file
  if [ "$DST" = "" ]; then # old file not found
    echo "no destination found!"
    continue # go to next file
  fi
  echo "destination file: $DST"
  cp -f "./${SRC}" "${DST}" # copy the new file over the old file
done

exit 0
Název: Re:script pro vysavač
Přispěvatel: rejže 29 Května 2016, 11:35:51
Nevypisuje. Připadá mi,že když se zfunkční ten řádek co řešíme,tak to narazí na něco co to úplně zmate. Každopádně hlášky aplay proběhnou obě. Jediný co mne napadá,že to pak nezapíše na flashku,ale někam jinam.
Název: Re:script pro vysavač
Přispěvatel: Jakub Vaněk 29 Května 2016, 12:16:18
Asi už jsem na stopě. Po projití celého vlákna jsem došel k tomu, že ten skript není v kořeni / (s tím jsem počítal). Teď ten skript bere soubory z určitého adresáře (první argument, může to být i to /mnt/usb) do určitého adrešáře (to může být třeba /usr).
Kód: [Vybrat]
#!/bin/sh

if [ "$#" -ne 2 ]; then
  echo "error: wrong number of arguments"
  echo "usage: $(basename $0) <source directory> <destination directory>"
  exit 1
fi

SRC_DIR="$1"
DST_DIR="$2"

ls -AF "$SRC_DIR" | sed '/\(\/\|=\||\|>\)$/d;s/\(\*\|@\)$//;/\.sh$/d' | while read SRC # find new files
do # for each file
  echo "source file: $SRC"
  DST=$(find "$DST_DIR" -name "$SRC" | head -n 1) # where to copy the file
  if [ "$DST" = "" ]; then # old file not found
    echo "no destination found!"
    continue # go to next file
  fi
  echo "destination file: $DST"
  cp -f "$SRC_DIR/${SRC}" "${DST}" # copy the new file over the old file
done

exit 0
Název: Re:script pro vysavač
Přispěvatel: Jakub Vaněk 29 Května 2016, 12:42:31
Napadlo mě ještě jedno alternativní velmi jednoduché řešení: udělat si v nějaké složce adresářový strom s náhradami souborů a pak jen použít:
Kód: [Vybrat]
cp -rf /cesta/ke/zdroji/* /cesta/k/cíli/Netrpí to problémem s různými stejně nazvanými soubory.
Příklad:
Kód: [Vybrat]
cp -rf /mnt/* /usr-> /mnt/share/audio/foo.wav se nakopíruje do správného místa, do /usr/share/audio/foo.wav
-> /mnt/bin/bar.sh se nakopíruje do /usr/bin/bar.sh (i když předtím neexistoval)
Název: Re:script pro vysavač
Přispěvatel: rejže 29 Května 2016, 13:54:37
S tim kořenem bych to nevidel.  Do vysavače mám ten skript upravený o proměnnou SOURCE_PATH = /mnt/usb. Tak to používají ve bšech skriptech pro vysavač, tak to radši dodržuju. Pak ten skript vypadá takhle. 
Kód: [Vybrat]
#!/bin/sh
#IS_HIT_UPDATE_SCRIPT=1

SOURCE_PATH="/mnt/usb"
exec 2>"$SOURCE_PATH"/log/$(basename $0).debug
set -x

aplay -c 1 -r 16000 -f S16_LE /usr/SNDDATA/SND_NOTICE_UPDATE_START.snd

cd "$SOURCE_PATH"

ls -AF | sed '/\(\/\|=\||\|>\)$/d;s/\(\*\|@\)$//;/\.sh$/d' | while read SRC # vyhledá nové soubory
do # pro každý soubor
  echo "source file: $SRC"
  DST=$(find /usr -name "$SRC" | head -n 1) # kam kopírovat soubor
  if [ "$DST" = "" ]; then # old file not found
    echo "no destination found!"
    continue # pokračovat dalším souborem
  fi
  echo "destination file: $DST"
  echo "${SOURCE_PATH}/${SRC}" "${DST}" # kopírování do určeného umístění ve vysavači
done
aplay -c 1 -r 16000 -f S16_LE /usr/SNDDATA/SND_NOTICE_UPDATE_END.snd
exit 0

Místo cp dávám echo z opatrnosti, dokud nevim přesně co ten skript provede.
Název: Re:script pro vysavač
Přispěvatel: Jakub Vaněk 29 Května 2016, 22:52:57
Už mě nic nenapadá. Jedině zkusit zadávat příkazy přímo po jednom. Šlo by to udělat na počítači, první věc je zkopírovat si celý souborový systém (kromě /dev, /sys a /proc) na flešku s oddílem ext4. Pak se přes chroot a qemu-static dostat k shellu a tam to vyzkoušet.
Název: Re:script pro vysavač
Přispěvatel: rejže 30 Května 2016, 13:14:38
Diky za vsechno.  Bylo to podnetny a zajimavy.  Zkusim jeste cyklus For, pokud to jde podle poctu souboru.  A jinak to budu resit po jednom jako dosud. Kazdopadne je to motivace konkretnim problemem a to me nauc..  ;-)
Btw.  Objednal jsem wifi dongle, tak ne nem zprovoznim wifi a jestli pujde ssh tak to muze byt jeste zajimavy.
Název: Re:script pro vysavač
Přispěvatel: rejže 07 Června 2016, 02:28:50
Tak jsem nainstaloval wlan hack a získal spoustu nových možností. SSH, a hlavne webove rozhrani, ktere nabizi ovladani na displayi možnost editovat některé soubory, spustit režimy které drív neměl a pohled jeho okem. (Má kameru). Mail jsem zatim nerozěhl.
Název: Re:script pro vysavač
Přispěvatel: ntz_reloaded 07 Června 2016, 12:33:24
hmm .... muzes sem dat prosimte odkaz na tu vec, zacal jsem byt docela zvedavej
Název: Re:script pro vysavač
Přispěvatel: rejže 07 Června 2016, 13:48:05
Odkaz je tady: http://www.roboter-forum.com/showthread.php?10009-LG-Hombot-3-0-WLAN-amp-Kamera-Steuerung-per-Weboberfl%E4che (http://www.roboter-forum.com/showthread.php?10009-LG-Hombot-3-0-WLAN-amp-Kamera-Steuerung-per-Weboberfl%E4che) Je to teda německy, ale s prekladačem to jde.
Název: Re:script pro vysavač
Přispěvatel: ntz_reloaded 07 Června 2016, 13:49:18
Tak jsem nainstaloval wlan hack a získal spoustu nových možností. SSH, a hlavne webove rozhrani, ktere nabizi ovladani na displayi možnost editovat některé soubory, spustit režimy které drív neměl a pohled jeho okem. (Má kameru). Mail jsem zatim nerozěhl.
tohle me definitivne upoutalo :D

cumim, co to vsechno umi ...
Název: Re:script pro vysavač
Přispěvatel: rejže 07 Června 2016, 13:57:32
Jj manželka má uklizíno bez práce, já mám hračku a co jsem mu vyměnil hlasový soubory za hlášky z filmu číslo 5 žije je i vtipnej.  :D
Název: Re:script pro vysavač
Přispěvatel: ntz_reloaded 07 Června 2016, 16:22:06
hmm ... pokud to umi i varit, tak by mi stacil jen ten vysavac (manzelku uz bych nepotreboval ......)
Název: Re:script pro vysavač
Přispěvatel: rejže 07 Června 2016, 18:08:21
Vzhledem k tomu, ze jsem kuchař, to tak je, ale jeste si ji necham.  ;D