Как защитить выражения в команде find от интерпретации оболочкой?

eval подходит, если вы используете его правильно:

Func1() {
  eval "$1=\$str1"
}

Безопасно, пока Func1 вызывается только с имена переменных, которые вы хотите передать.

Как всегда, переменные нужно заключать в кавычки. И здесь $ str1 не нужно расширять перед передачей в eval .

Если в Func1 могут быть переданы произвольные строки, которые не находятся под вашим контролем, тогда у вас возникнут проблемы со значениями вроде reboot; foo , и вам потребуется очистить его следующим образом:

Func1() {
  case $1 in
    "" |\
    *[!abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]* |\
    [0123456789]* |\
    BASH* | LD_* | PATH | IFS | ENV | SHELLOPTS | PERL5LIB | PYTHON_PATH |...)
      echo >&2 "Can't set that variable"
      return 1
  esac
  eval "$1=\$str1"
}

Однако составить полный список проблемных переменных - обреченная задача.

2
25.03.2017, 23:43
2 ответа

Из-за того, что OP цитирует выражение '! -name *. * ' превращается во второй аргумент find . Итак, теперь find думает, что вы передали ему 2 имен каталогов, а именно, . и безумное имя ! -name *. * , поэтому он будет добросовестно попытаться рекурсивно перечислить все файлы / подкаталоги в этих двух. С . Пока все хорошо, но когда придет время погрузиться в этот сумасшедший режиссер. ! -name *. * не может, если он у вас нет. И даже тогда find не будет делать то, что вы хотели.

Для этого вы должны указать соответствующие места:

find . ! -name '*.*'

или

eval find . '! -name "*.*"'
5
27.01.2020, 21:53

Попробуйте заключить только выражение в одинарные кавычки.

find . ! -name '*.*'
1
27.01.2020, 21:53

Теги

Похожие вопросы