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 bash
seperti 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 .dot
atas 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 echo
tidak peduli dengan argumennya.
var='echo "this is var"' ; $var
KELUARAN:
"this is var"
Lihat? Tanda kutip ganda muncul karena hasil ekspansi shell $var
tidak dievaluasi quote-removal
.
var='printf %s\\n "this is var"' ; $var
KELUARAN:
"this
is
var"
Tetapi dengan eval
atau sh
:
var='echo "this is var"' ; eval "$var" ; sh -c "$var"
KELUARAN:
this is var
this is var
Ketika kita menggunakan eval
atau sh
shell 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'; $e
berfungsi dengan baik.