2016-10-21 4 views
2

Обратите внимание на следующееBash интерпретирует && в качестве аргумента

[[email protected] ~]$ test="echo hello && echo world" 
[[email protected] ~]$ $test 
hello && echo world 
[[email protected] ~]$ echo hello && echo world 
hello 
world 

Кажется, что если вы поместите & & в переменный Баше и выполнить его как команду, Баш интерпретирует & & как строковый аргумент. Кто-нибудь знает, как изменить это поведение? То есть кто-нибудь знает, как сказать bash «Я хочу выполнить двойной амперсанд».

ответ

5

Переменные не предназначены для хранения сценариев. Храните код в функциях, а не в переменных.

$ test() { echo hello && echo world; } 
$ test 
hello 
world 

Причина $test не работает, потому что котирующаяся переменная разложения подвергается только два из многих этапов BASh в парсинге:

  1. Слова расщепление
  2. глобирования

Это означает, что он разделит $test на отдельные слова, поэтому он распознает команду echo. Он также расширит подстановочные знаки AKA globs. Тем не менее, это только два бита разбора. Он не ищет таких символов, как &&, |, или ;.

Я не рекомендую его, но вы можете получить bash для выполнения вашей строки с bash -c "$test" или eval "$test". Это вредные привычки, которых следует избегать, если это абсолютно необходимо. Функции намного лучше, чем хаки с eval, и они не открывают потенциальные дыры в безопасности, позволяя выполнять произвольный код.