Arasındaki en önemli fark
bash -c "$1"
Ve
eval "$1"
Eski bir deniz kabuğu içinde çalışır ve ikincisi yoktur. Yani:
set -- 'var=something'
bash -c "$1"
echo "$var"
ÇIKTI:
#there doesn't seem to be anything here
set -- 'var=something'
eval "$1"
echo "$var"
ÇIKTI:
something
bashYine de, neden herkesin yürütülebilir dosyasını bu şekilde kullandığı hakkında hiçbir fikrim yok . Çalıştırmanız gerekiyorsa, garantili yerleşik POSIX kullanın sh. Ya (subshell eval)da çevrenizi korumak istiyorsanız.
Şahsen ben .dother şeyden önce kabuğun tercih ederim .
printf 'var=something%d ; echo "$var"\n' `seq 1 5` | . /dev/fd/0
ÇIKTI
something1
something2
something3
something4
something5
AMA HER ŞEYE İHTİYACINIZ VAR MI?
Gerçekten kullanmak için tek neden, değişkeninizin gerçekte başka bir atama veya değerlendirme yapması veya kelime ayırmanın çıktı için önemlidir.
Örneğin:
var='echo this is var' ; $var
ÇIKTI:
this is var
Bu işe yarıyor, ancak yalnızca bunun nedeni echo, argüman sayısını umursamıyor.
var='echo "this is var"' ; $var
ÇIKTI:
"this is var"
Görmek? Çift tırnak, kabuğun genişlemesinin sonucu olarak $vardeğerlendirilmediğinden ortaya çıkar quote-removal.
var='printf %s\\n "this is var"' ; $var
ÇIKTI:
"this
is
var"
Ancak evalveya sh:
var='echo "this is var"' ; eval "$var" ; sh -c "$var"
ÇIKTI:
this is var
this is var
Kullandığımızda evalveya shkabuk, genişlemelerin sonuçlarından ikinci bir kez geçer ve bunları potansiyel bir komut olarak değerlendirir ve bu yüzden tırnaklar bir fark yaratır. Ayrıca şunları da yapabilirsiniz:
. <<VAR /dev/fd/0
${var:=echo "this is var"}
#END
VAR
ÇIKTI
this is var
e='echo foo'; $esadece iyi çalışıyor.