Решение, описанное в этом ответе, является кратким.
Это иногда перевешивает его недостатки:
Не сохраняет код результата.Если вам это нужно, используйте вместо этого решение ugexe.
Не сохраняет вывод в stderr.Если вам это нужно, используйте вместо этого решение ugexe.
Потенциальная уязвимость.Это объясняется ниже.Вместо этого рассмотрите решение ugexe.
Документирование описанных ниже функций начинается с наречие цитаты :exec
.
Самый безопасный небезопасный вариант: q
Самый безопасный вариант использует один q
:
say qx[ echo 42 ] # 42
Если есть ошибка, то конструкция возвращает пустую строку, и любое сообщение об ошибке появится в stderr.
Этот самый безопасный вариант аналогичен одиночной строке в кавычках, такой как 'foo'
, передаваемой в оболочку.Строки в одинарных кавычках не интерполируют , поэтому нет никакой уязвимости для атаки внедрения кода .
Тем не менее, вы передаете одну строку в оболочку, которая можетне та оболочка, которую вы ожидаете, поэтому она может не анализировать строку так, как вы ожидаете.
Наименее безопасный небезопасный вариант: qq
Следующая строка выдает тот же результат, что иq
, но используется наименее безопасный вариант:
say qqx[ echo 42 ]
Этот вариант с двойным q
аналогичен строке с двойными кавычками ("foo"
).Эта форма строкового цитирования выполняет интерполяцию , что означает, что она подвергается атаке внедрения кода , если вы включите переменную в строку, переданную оболочке.