Предотвращение ошибок из-за нерасширенной звездочки

Добавьте это как первую строку сценария:

[ "$UID" -eq 0 ] || exec sudo bash "$0" "$@"

Изменение sudo кому: gksu или gksudo если Вы предпочитаете графическую подсказку.

16
18.11.2012, 22:56
4 ответа

Да, выполните следующую команду:

shopt -s nullglob

это аннулирует соответствие, и никакая ошибка не будет инициирована.

  • если Вы хотите это поведение по умолчанию, включаете команду Ваш ~/.bashrc
  • если Вы хотите обнаружить пустой шарик в оболочке POSIX, попробовать

    for i in *.txt; do
      [ "$i" = '*.txt' ] && [ ! -e '*.txt' ] && continue
    done
    

См. http://mywiki.wooledge.org/NullGlob

20
27.01.2020, 19:48
  • 1
    Обратите внимание, что на самом деле возможно назвать файл *.txt. Это стоило бы проверить, существует ли файл. сообщение –  Chris Down 18.11.2012, 21:17
  • 2
    отредактировано соответственно. –  Gilles Quenot 18.11.2012, 21:20
  • 3
    @ChrisDown, которое тот же комментарий как на Вашем ответе применяет здесь (с потенциально более серьезными последствиями из-за break вместо continue). –  Stéphane Chazelas 19.11.2012, 12:59

В ударе можно использовать shopt -s nullglob расшириться до пустого массива, при отсутствии соответствий.

В POSIX окружает без nullglob, можно избежать этой проблемы путем проверки, что имя файла, передаваемое на самом деле, существует при наличии [ -e "$file" ] || [ -L "$file" ] || continue как первая часть Вашего for цикл.

6
27.01.2020, 19:48
  • 1
    Обратите внимание, что это не было бы строго эквивалентно с тех пор [ -e возвратил бы false для недоступных файлов или файлов, которые являются символьными ссылками на недоступные или несуществующие файлы. –  Stéphane Chazelas 18.11.2012, 21:14
  • 2
    @StephaneChazelas, позвольте точкам о символьных ссылках быть подтвержденными. Но что Вы имеете в виду "недоступными файлами"? Даже если я chmod 0 the_file, [ -e the_file ] все еще оценивает верный, таким образом, это должно быть что-то еще. –  dubiousjim 18.11.2012, 23:34
  • 3
    отправил редактирование для обработки поврежденных символьных ссылок. надежда это в порядке. –  dubiousjim 18.11.2012, 23:38
  • 4
    @dubiousjim, mkdir -p x/{a,b} && chmod 444 x && echo x/* && [ -e x/a ]. x/a недоступен, но поскольку x является читаемым x /* расширится. –  Stéphane Chazelas 19.11.2012, 11:51
  • 5
    @StephaneChazelas, большой, благодарит объяснить. –  dubiousjim 19.11.2012, 18:22

Обычная техника для оболочек, которые не имеют a nullglob опция

set -- [*].type *.type
case $1$2 in
  '[*].type*.type') shift 2;;
  *) shift
esac
for file do
  cmd  -- "$file"
done

Дополнительное [*].type должен покрыть случай, где существует один названный файл *.type в текущем каталоге.

Теперь, если Вы хотите включать точечные файлы, который становится более сложным.

Я полагаю, что техника была выдумана Laura Fairhead в Usenet несколько лет назад.

4
27.01.2020, 19:48

find . -name '*.type' -maxdepth 0 -exec somecommand "{}" ";"

Это удаляет for цикл и globbing оболочки от уравнения полностью. find выполнится -exec управляйте однажды на соответствие, и если не будет никаких соответствий, то оно никогда не будет выполняться. -maxdepth 0 сообщает находят для не рекурсивного вызова в подкаталоги именованного параметра пути (., в этом случае).

Оборотная сторона - то, что это включает другое приложение, хотя тот, который присутствует в фактически каждой системе Linux там (и вероятно большая часть Unixes также).

0
27.01.2020, 19:48

Теги

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