Perbedaan paling penting di antara keduanya
bash -c "$1"
Dan
eval "$1"
Apakah yang pertama berjalan dalam subkulit dan yang terakhir tidak. Begitu:
set -- 'var=something'
bash -c "$1"
echo "$var"
KELUARAN:
#there doesn't seem to be anything here
set -- 'var=something'
eval "$1"
echo "$var"
KELUARAN:
something
Saya tidak tahu mengapa ada orang yang menggunakan executable bashseperti itu. Jika Anda harus memintanya, gunakan POSIX built-in dijamin sh. Atau (subshell eval)jika Anda ingin melindungi lingkungan Anda.
Secara pribadi, saya lebih suka shell di .dotatas segalanya.
printf 'var=something%d ; echo "$var"\n' `seq 1 5` | . /dev/fd/0
KELUARAN
something1
something2
something3
something4
something5
TETAPI ANDA BUTUHKAN?
Satu-satunya alasan untuk menggunakan salah satunya adalah jika variabel Anda benar-benar menetapkan atau mengevaluasi yang lain, atau pemisahan kata penting untuk output.
Contohnya:
var='echo this is var' ; $var
KELUARAN:
this is var
Itu bekerja, tetapi hanya karena echotidak peduli dengan argumennya.
var='echo "this is var"' ; $var
KELUARAN:
"this is var"
Lihat? Tanda kutip ganda muncul karena hasil ekspansi shell $vartidak dievaluasi quote-removal.
var='printf %s\\n "this is var"' ; $var
KELUARAN:
"this
is
var"
Tetapi dengan evalatau sh:
var='echo "this is var"' ; eval "$var" ; sh -c "$var"
KELUARAN:
this is var
this is var
Ketika kita menggunakan evalatau shshell mengambil pass kedua pada hasil ekspansi dan mengevaluasinya sebagai perintah potensial juga, dan dengan demikian tanda kutip membuat perbedaan. Anda juga dapat melakukan:
. <<VAR /dev/fd/0
${var:=echo "this is var"}
#END
VAR
KELUARAN
this is var
e='echo foo'; $eberfungsi dengan baik.