Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: Spustenie príkazu z premennej  (Přečteno 1293 krát)

Cocumis

  • Návštěvník
  • Příspěvků: 22
  • Za gramatické chyby sa vopred ospravedlňujem :D
Spustenie príkazu z premennej
« kdy: 05 Prosince 2012, 18:28:14 »
Prajem pekný deň

Mám program, ktorý simuluje presmerovania (|,<,>,>>,2>) s nazvom rura a problém s nechcenou expanziou znakov .*. keď ho chcem spustiť v skripte. Najlepšie bude keď uvediem príklad:
Kód: [Vybrat]
...
echo Zadajte príkaz.
read pr
$pr
...
Keď po výzve zadám napríklad niečo takého:
Kód: [Vybrat]
./rura ls -l \| grep '.*'
do programu rura sa na miesto argumentu .* dostane argument '.*' aj zo znakom '.
Keď nepoužijem znak ' teda iba :
Kód: [Vybrat]
./rura ls -l \| grep .*
tak sa .* expanduje. Ak použijem znak \ na odstránenie špecialneho významu pre . a * tak je výsledok rovnaký ako keby som \ nepoužil.
Na nete som našiel, že by som mohol použiť vypnutie expanzie cez príkaz set -f , ale to sa mi moc nepáči. Chcel by som vedieť ako do programu dostať .* bez toho aby som vypínal expanziu.
Vopred dik za rady.
Za gramatické chyby sa vopred ospravedlňujem :D

ntz_reloaded

  • Lokaj
  • Závislák
  • ***
  • Příspěvků: 3735
  • skill :: ur home erly
Re:Spustenie príkazu z premennej
« Odpověď #1 kdy: 05 Prosince 2012, 19:42:34 »
ukaz nam prosim cely ten program a rekni, co to ma delat ..
tikejte mi, taky Vam tikam ...
song of the day - openSUSE, openindiana, DuckDuckGo
The noise ain't noise anymore, who's to blame, WHO'S TO BLAME ??

Cocumis

  • Návštěvník
  • Příspěvků: 22
  • Za gramatické chyby sa vopred ospravedlňujem :D
Re:Spustenie príkazu z premennej
« Odpověď #2 kdy: 05 Prosince 2012, 22:22:22 »
Ak myslíš ten program rura, tak ten má robiť to isté ako presmerovania v bashy. Príklad:
Kód: [Vybrat]
./rura ls -l \| grep '.*'urobí to isté ako
Kód: [Vybrat]
ls -l | grep '.*'a tak isto je to s presmerovaniamy do súboru a zo súboru.
Program ako taký funguje fajn. Problém je v tom, že chcem spraviť skript s ukážkami. Uživateľ si vyberie ktorú ukážku chce spustiť a ona sa spustí. Každý príkaz z každej ukážky je uložený v premennej. Avšak keď tieto príkazi spúšťam s premennej, tak tam mi vzniká ten spomínaný problém s tými jednoduchými uvodzovkami.
Tu je kód ak to pomôže:
Kód: [Vybrat]
#!/bin/bash
p1="./rura ls -l \> subor"
p2="./rura cat \< subor"
p3="./rura cat \< subor | grep rura"
p4="./rura find /home \> out 2\> err"
p5="./rura find /home 2\> /dev/null \| grep '.*/[zZ].*' \| sed s'!.*/\([zZ].*\)!\1!' \| sort \| uniq"
p6="./rura find /home \| grep 'blby regex\1'"
p7="./rura -e find \| grep 'blby regex\1'"
p8="./rura programktoryneexistuje"
p9="./rura -v ls -l \| grep '.*' 2\> err \| sort \>\> vystupsort"
p10="./rura ls-l \> vystupls \| grep rura"

menu()
{
clear
echo Vyberte si voľbu:
echo
echo "    Presmerovania:"
echo 1\) $p1
echo 2\) $p2
echo 3\) $p3
echo 4\) $p4
echo 5\) $p5
echo
echo "    Ukážka spracovania chyby:"
echo 6\) $p6
echo 7\) $p7
echo 8\) $p8
echo
echo "    Výpis všetkých procesov:"
echo 9\) $p9
echo
echo "    Ukladanie medzivýsledkov:"
echo 10\) $p10
echo
echo 11\) Vlastný príkaz
echo 0\) Koniec
read vyber
}

while true
do
menu
case $vyber in
1)
clear
echo $p1
$p1
echo Výpis súboru \"subor\"
cat subor
pokracuj;;
2)
clear
echo $p2
$p2
pokracuj;;
3)
clear
echo $p3
$p3
pokracuj;;
4)
clear
echo $p4
$p4
echo Výpis súboru \"out\"
cat out
echo Výpis súboru \"err\"
cat err
pokracuj;;
5)
clear
echo $p5
$p5
pokracuj;;
6)
clear
echo $p6
$p6
pokracuj;;
7)
clear
echo $p7
$p7
pokracuj;;
8)
clear
echo $p8
$p8
pokracuj;;
9)
clear
echo $p9
$p9
echo Výpis súboru \"err\"
cat err
echo Výpis súboru \"vystupsort\"
cat vystupsort
pokracuj;;
10)
clear
echo $p10
$p10
echo Výstup súboru \"vystupls\"
pokracuj;;
11)
                        #o tejto casti som hovoril v prvom prispevku, ale tyka sa to vsetkych premennych
clear
echo Zadajte príkaz.
read pr
echo "$pr"
$pr
pokracuj;;
0) exit;;
esac
done

« Poslední změna: 05 Prosince 2012, 22:25:16 od Cocumis »
Za gramatické chyby sa vopred ospravedlňujem :D

Cocumis

  • Návštěvník
  • Příspěvků: 22
  • Za gramatické chyby sa vopred ospravedlňujem :D
Re:Spustenie príkazu z premennej
« Odpověď #3 kdy: 07 Prosince 2012, 00:02:16 »
Ok takže možné riešenie je takéto:
Kód: [Vybrat]
tmp=$(mktemp)  #vytvorí dočasný súbor, jeho názov sa uloží do premennej tmp
head -1 > $tmp   #číta zo štandardného vstupu jeden riadok a uloží ho do dočasného súboru
source $tmp       #predpokladám že spustí to čo je v tom súbore
rm -f $tmp         #zmaže dočasný súbor
Tak isto to funguje aj s príkazmi, ktoré sú natvrdo uložené v premennej, len namiesto
Kód: [Vybrat]
head -1 > $tmp sa použije
Kód: [Vybrat]
echo $premenna > $tmp.Otázka znie, nedá sa to aj nejak bez vytvárania dočasného súboru???
Za gramatické chyby sa vopred ospravedlňujem :D

 

Provoz zaštiťuje spolek OpenAlt.