Рассмотрим следующий код:
#!/bin/bash -x
VAR='1 2 3'
bash -c "echo "\$$VAR""
eval "echo "\$$VAR""
bash -c "echo \"\$$VAR\""
eval "echo \"\$$VAR\""
Какие выходы:
+ VAR='1 2 3'
+ bash -c 'echo $1' 2 3
3
+ eval 'echo $1' 2 3
++ echo 2 3
2 3
+ bash -c 'echo "$1 2 3"'
2 3
+ eval 'echo "$1 2 3"'
++ echo ' 2 3'
2 3
Кажется, что оба eval
и bash -c
интерпретируют коды так же, как i.e "echo "\$$VAR""
до 'echo $1' 2 3
и "echo \"\$$VAR\""
до 'echo "$1 2 3"'
.
Единственное отличие, которое я, по-видимому, замечаю, заключается в том, что bash -c
открывает подоболочку и таким образом изменяет результаты от eval
. Например, в
bash -c 'echo $1' 2 3
2 и 3 - позиционные параметры для подоболочки. С другой стороны, в
eval 'echo $1' 2 3
это просто еще один аргумент для echo
.
Итак, мой вопрос в том, является ли опция -c
(bash -c
, sh -c
или другие эквиваленты оболочек) безопасной для использования или она зла, как eval
?