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: Cocumis 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:
...
echo Zadajte príkaz.
read pr
$pr
...
Keď po výzve zadám napríklad niečo takého:
./rura ls -l \| grep '.*'
do programu rura sa na miesto argumentu .* dostane argument '.*' aj zo znakom '.
Keď nepoužijem znak ' teda iba :
./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.
-
ukaz nam prosim cely ten program a rekni, co to ma delat ..
-
Ak myslíš ten program rura, tak ten má robiť to isté ako presmerovania v bashy. Príklad:
./rura ls -l \| grep '.*'
urobí to isté ako
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:
#!/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
-
Ok takže možné riešenie je takéto:
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 head -1 > $tmp
sa použije
echo $premenna > $tmp.
Otázka znie, nedá sa to aj nejak bez vytvárania dočasného súboru???