Существуют другие причины, но с точки зрения безопасности я никогда не хотел бы, чтобы сценарий сделал предположения о корректном пути. Что, если это неправильно и это выполняет неправильную оболочку или интерпретатор? Тот, который был вставлен злонамеренным пользователем? Или что, если это полагается на конкретную оболочку и откажет, если неправильная оболочка используется?
Пользователи могут бездельничать с их путем и повредиться, материал - не доверяют user:-), я провел многочисленные нападения, которые полагаются на пользователя, делающего неправильную вещь с их путем - обычно получением вещей в неправильном порядке - таким образом, я могу ниспровергать нормальный вызов сценария.
Да, я знаю, записали ли Вы сценарий сами, можно вполне справедливо утверждать, что разобрались в своем собственном пути, но интерпретатор не может принять те решения.
Полезно помнить это [
на самом деле команда, обычно также доступная как test
. В ударе это - встроенное, таким образом, Вы видите документацию с man builtin
.
В этом documentaiton:
test and [ evaluate conditional expressions using a set of rules
based on the number of arguments.
0 arguments
The expression is false.
1 argument
The expression is true if and only if the argument is not
null.
2 arguments
[...]
3 arguments
[...]
Правила с двумя аргументами являются различными тестами, и с тремя аргументами обычно являются сравнениями. При помещении пространства вокруг = Вы получаете три аргумента. Но когда Вы соединяете все это, Вы получаете один аргумент, и как Вы видите, если тот аргумент не является нулевым, это возвращает true.
Равняется оператору, ничего не делает в этом случае.
$S1=$S2 выражения оценивает к фактической строке, со значениями S1 и S2 на месте, эффективно строкового литерала "foo=bar".
Так как этот строковый литерал не является пустым, оператор
if [ "foo=bar" ];
оценивает к истинному, и тело, если оператор выполняется.
[ "$S1" = "$S2" ]
. Иначе, если $S1
или $S2
содержите подстановочный знак или пробелы, они были бы расширены (например, попробовали бы обоих S1='a = a -o a'
и S2='b'
). В ksh, ударе и zsh, можно использовать [[ $S1 = $S2 ]]
, потому что [[
…]]
специальный синтаксис оболочки тогда как [
обычная команда с забавным именем. Обратите внимание, что Вам также нужны пробелы вокруг скобок в любом случае.
– Gilles 'SO- stop being evil'
18.02.2011, 23:08