Chcel by som vykonať dva alebo viac príkazov späť dozadu. Ale tieto príkazy sú uložené v premennej v mojom skripte. Napríklad,
var="/usr/bin/ls ; pwd ; pooladm -d; pooladm -e"
Problém nastáva, keď spustím túto premennú prostredníctvom môjho skriptu. Predpokladajme, že ide:
#!/bin/ksh -p
..
..
var="/usr/bin/ls ; pwd;pooladm -d; pooladm -e"
..
..
$var # DOES NOT WORK ..BUT WORKS WITH EVAL
To nefunguje .. Ale v momente, keď používam eval:
eval $var
Funguje to úžasne.
Len som sa opýtal, či existuje iný spôsob, ako vykonať veľa príkazov uložených v premennej bez použitia eval.
tiež , Používanie evalu sa považuje za zlé programovanie, pretože moje kódexové štandardy sa zdajú vyhnúť jeho používaniu, než ho objať. Prosím, dajte mi vedieť.
odpovede:
2 pre odpoveď č. 1Pamätajte, že shell iba raz rozoberá riadok. Takže keď rozbalíte $ var, stáva sa jedným reťazcom obsahujúcim prázdne miesta. Keďže nemáte spustiteľný súbor s názvom "/ usr / bin / ls; pwd; pooladm -d; pooladm -e", nemôže to bežať.
Na druhej strane, eval má svoje argumenty sú re-skenuje je, teraz dostanete "/ usr / bin / ls", "pwd", a tak ďalej. Funguje to.
eval
je trochu chytľavý, pretože zanecháva možný bezpečnostný otvor - zvážte, či sa niekto podarilo dostať "rm -rf /" do reťazca. Ale je to užitočný nástroj.
1 pre odpoveď č. 2
Použite záplaty a ozvenu. Vo vašom prípade
`echo $var`
1 pre odpoveď č. 3
Môžete použiť inú kópiu shell na spustenie príkazu:
sh -c "$var"
To nie je nevyhnutne lepšie ako používanie systému eval. Hlavným praktickým rozdielom je, že eval spustí príkazy v kontexte aktuálneho shell, zatiaľ čo "sh -c" spúšťa príkazy v samostatnej inštancii shell. ak var
obsahuje príkazy na nastavenie premenných prostredia alebo zmenu aktuálneho adresára, môžete alebo nechcete, aby tieto príkazy ovplyvnili súčasný shell.