evalkomutu ile ne yapabilirsiniz? Neden kullanışlıdır? Bash'te bir çeşit yerleşik fonksiyon mu? Bunun için
man` sayfası yok..
eval` POSIX'in bir parçasıdır. Yerleşik bir kabuk olabilen bir arayüzdür.
Bu konu "POSIX Programmer's Manual" içinde açıklanmıştır: http://www.unix.com/man-page/posix/1posix/eval/
eval - construct command by concatenating arguments
Bir argüman alacak ve kabuk tarafından yürütülecek bir komut oluşturacaktır. Bu man sayfası örneğidir:
1) foo=10 x=foo
2) y='$'$x
3) echo $y
4) $foo
5) eval y='$'$x
6) echo $y
7) 10
$foo
değerini '10'
ve $x
değerini 'foo'
ile tanımlarsınız.'$foo'
dizesinden oluşan $y
tanımlayın. Dolar işaretinden kaçılmalıdır
ile '$'
.echo $y
.'$foo'
dizesi olacaktır.eval
ile tekrarlıyoruz. İlk olarak $x
değerini 'foo'
dizesine değerlendirecektir. Şimdi y=$foo
deyimimiz var ve bu deyim y=10
olarak değerlendirilecek.ifadesinin sonucu artık
'10'` değeridir.Bu, Perl ve JavaScript gibi birçok dilde yaygın bir işlevdir. Daha fazla örnek için perldoc eval'a bir göz atın: http://perldoc.perl.org/functions/eval.html
Evet, eval
bir bash dahili komutudur, bu yüzden bash
man sayfasında açıklanmıştır.
eval [arg ...]
The args are read and concatenated together into a single com-
mand. This command is then read and executed by the shell, and
its exit status is returned as the value of eval. If there are
no args, or only null arguments, eval returns 0.
Genellikle Command Substitution ile birlikte kullanılır. Açık bir eval
olmadan, kabuk bir komut ikamesinin sonucunu değerlendirmeye değil çalıştırmaya çalışır.
Diyelim ki VAR=değer; echo $VAR
eşdeğerini kodlamak istiyorsunuz. Kabuğun echo VAR=value
yazılarını nasıl ele aldığı konusundaki farka dikkat edin:
andcoz@...:~> $( echo VAR=değer )
bash: VAR=value: komut bulunamadı
andcoz@...:~> echo $VAR
<boş satır>
Kabuk echo
ve VAR=value
komutlarını iki ayrı komut olarak çalıştırmaya çalışır. İkinci dize hakkında bir hata verir. Atama etkisiz kalır.
2.
andcoz@...:~> eval $( echo VAR=value )
andcoz@...:~> echo $VAR
değer
Kabuk, echo
ve VAR=value
dizelerini birleştirir (concatenates), bu tek birimi uygun kurallara göre ayrıştırır ve çalıştırır.
Son olarak, eval
çok tehlikeli bir komut olabilir. Güvenlik sorunlarından kaçınmak için eval
komutuna girilen her girdi dikkatlice kontrol edilmelidir.
evalkomutunun man sayfası yoktur, çünkü ayrı bir harici komut değildir, daha ziyade bir kabuk yerleşik komutudur, yani kabuğun (
bash) içinde bulunan ve sadece kabuk tarafından bilinen bir komuttur. bash
man sayfasının ilgili kısmı şöyle der:
eval [arg ...]
The args are read and concatenated together into a single command.
This command is then read and executed by the shell, and its exit
status is returned as the value of eval. If there are no args, or only
null arguments, eval returns 0
Ek olarak, help eval
ise çıktı şöyledir:
eval: eval [arg ...]
Execute arguments as a shell command.
Combine ARGs into a single string, use the result as input to the shell,
and execute the resulting commands.
Exit Status:
Returns exit status of command or success if command is null.
eval` güçlü bir komuttur ve eğer kullanmayı düşünüyorsanız, beraberinde gelen olası güvenlik risklerini önlemek için çok dikkatli olmalısınız.