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
bash
Yine 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 .dot
her ş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 $var
değerlendirilmediğinden ortaya çıkar quote-removal
.
var='printf %s\\n "this is var"' ; $var
ÇIKTI:
"this
is
var"
Ancak eval
veya sh
:
var='echo "this is var"' ; eval "$var" ; sh -c "$var"
ÇIKTI:
this is var
this is var
Kullandığımızda eval
veya sh
kabuk, 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'; $e
sadece iyi çalışıyor.