/ / Eval pre vykonanie viacerých príkazov v ksh93, Solaris - solaris, eval, ksh

Eval pre vykonanie viacerých príkazov v ksh93, Solaris - solaris, eval, ksh

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ď č. 1

Pamä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.