Цитаты ("..."
) не оцениваются, когда вы делаете:
$($COMMAND)
То, что видит удаленный Bash, это два аргумента: "echo
и 'hello'"
, не echo 'hello'
, как вы ожидаете.
В вашем случае я бы предложил использовать массив:
COMMAND=( ssh localhost "echo 'hello'" )
OUTPUT=$( "${COMMAND[@]}" )
Слова в (...)
являются элементами массива. В этом случае echo 'hello'
виден один элемент: кавычки оцениваются сразу при назначении. Затем, когда вы делаете "${COMMAND[@]}"
, каждый элемент будет передан в качестве нетронутого аргумента.
Есть также несколько других способов решения этой проблемы, например, использование eval
для оценки кавычек, но по моему опыту использование массивов является самым безопасным и простым способом построения и выполнения команд. С помощью массивов легко предотвратить атаки с использованием оболочки, предотвратить нежелательное расширение, предотвратить разрыв слов при наличии пробела. Единственным недостатком является то, что массивы доступны не в каждой оболочке.
Причина в том, что расширение (т.е. $COMMAND
) не оценивает кавычки.
Это демонстрируется этим простым примером, где мы печатаем каждый аргумент по одному на строку:
$ COMMAND="ssh localhost \"echo 'hello'\""
$ for x in $COMMAND; do echo "$x"; done
ssh
localhost
"echo
'hello'"
Используя вместо этого массив:
$ COMMAND=( ssh localhost "echo 'hello'" )
$ for x in "${COMMAND[@]}"; do echo "$x"; done
ssh
localhost
echo 'hello'
С массивом, [1113 ] в одной строке (т. е. это один аргумент), с простой строкой вместо "echo
и 'hello'"
разделяются.
Я работаю над проектом (в течение нескольких лет теперь), который использует и временные данные и временные many-many отношения. Каждая таблица имеет столбцы ValidFrom и ValidUntil (хранящий только даты).
Сначала необходимо определить семантику Допустимого* столбцы, т.е. включен ли ValidUntil или исключен из диапазона законности. Также необходимо указать, допустимы ли ПУСТЫЕ даты и каково их значение.
Затем Вам нужны несколько функций, таких как dbo. Overlaps2 () и dbo. Overlaps3 (), которые получают 2 и 3 диапазона даты соответственно и возвращаются 1, если дата располагается перекрытие и 0 иначе.
Вдобавок ко всему, я определил представления для many-many отношений с dbo. Overlap3 (...) =1.
Одна дальнейшая точка должна иметь ряд функций, которые вычисляют эффективный диапазон законности на основе дат в 2 или 3 связанных таблицах.
Недавно я должен был добавить функциональность, чтобы позволить пользователю отображать все доступные данные или только в настоящее время допустимые данные. Я сохраняю эту настройку в пользовательской таблице, связываю SPID пользователю при открытии соединения и фильтрую записи в другом наборе представлений.