Сохранить команду в переменной; реализовать без `eval` - PullRequest
0 голосов
/ 25 июня 2019

Это почти тот же вопрос, что и в этом посте , за исключением того, что я не хочу использовать eval.

Короткий вопрос, я хочу выполнить команду echo aaa | grep a, сначала сохранив ее в строковой переменной Command='echo aaa | grep a', а затем запустив ее без использования eval.

В посте выше, выбранный ответ использовал eval. Это работает для меня тоже. Меня очень беспокоит то, что есть множество предупреждений о eval ниже, за которыми следуют некоторые попытки его обойти. Тем не менее, ни один из них не может решить мою проблему (по сути, ОП). Ниже я прокомментировал их попытки, но так как он был там в течение долгого времени, я думаю, что лучше задать вопрос снова с ограничением , а не , используя eval.

Конкретный пример

Мне нужен сценарий оболочки, который запускает мою команду, когда я счастлив:

#!/bin/bash
# This script run-this-if.sh runs the commands when I am happy
# Warning: the following script does not work (on nose)
if [ "$1" == "I-am-happy" ]; then
    "$2"
fi

$ run-if.sh I-am-happy [insert-any-command]

Ответы [ 2 ]

3 голосов
/ 25 июня 2019

Ваш пример использования не может работать с заданием, потому что назначения ограничены текущим процессом и его дочерними элементами.Поскольку нет причин пытаться поддерживать назначения, все становится намного проще:

#!/bin/sh
if [ "$1" = "I-am-happy" ]; then
    shift; "$@"
fi

В дальнейшем можно использовать все обычные методы для запуска конвейеров оболочки, такие как:

run-if-happy "$happiness" \
  sh -c 'echo "$1" | grep "$2"' _ "$untrustedStringOne" "$untrustedStringTwo"
* 1006.* Обратите внимание, что мы передаем execve() системный вызов argv с шестью элементами:
  • sh (оболочка для запуска; при желании измените на bash и т. Д.)
  • -c (сообщая оболочке, что следующим аргументом является код для ее запуска)
  • echo "$1" | grep "$2" (код для sh для анализа)
  • _ (aконстанта, которая становится $0)
  • ... независимо от того, содержит ли переменная оболочки untrustedStringOne ... (которая становится $1)
  • ... независимо от переменной оболочки untrustedStringTwoсодержит ... (который становится $2)

Обратите внимание, что echo "$1" | grep "$2" является константной строкой - в одинарных кавычках, без расширения параметров или подстановок команд- и что ненадежные значения передаются в слоты, которые заполняют $1 и $2, вне диапазона от оцениваемого кодаред;это важно для обеспечения какого-либо повышения безопасности по сравнению с тем, что даст eval.

0 голосов
/ 25 июня 2019

Вы всегда можете передать по каналу переводчику, например: echo $Command | bash

...