Выдать ошибку при использовании пустых переменных оболочки

Иногда я использую $PROJECT_HOME/* для удаления всех файлов в проекте. Когда переменная окружения PROJECT_HOME не установлена ​​(потому что я сделал su и у нового пользователя нет этой переменной окружения), он начинает удалять все файлы из корневой папки. Это апокалиптично.

Как настроить bash на ошибку, когда я использую неопределенную переменную среды в оболочке?

3 Solutions collect form web for “Выдать ошибку при использовании пустых переменных оболочки”

В оболочке POSIX вы можете использовать set -u :

 #!/bin/sh set -u : "${UNSET_VAR}" 

или с использованием расширения параметров :

 : "${UNSET_VAR?Unset variable}" 

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

 rm -rf -- "${PROJECT_HOME:?PROJECT_HOME empty or unset}"/* 
 [ -z "$PROJECT_HOME" ] || rm -r "$PROJECT_HOME"/* 

Это также уловит случай, когда PROJECT_HOME установлен, но не содержит ничего.

Пример:

1) Это удалит почти все, что вы можете удалить в своей системе (запрет dotfiles внутри / (обычно их нет)):

 set -u PROJECT_HOME= rm -r "$PROJECT_HOME"/* 

2) Это ничего не сделает:

 PROJECT_HOME= [ -z "$PROJECT_HOME" ] || rm -r "$PROJECT_HOME"/* 

Полностью удалить ваш проект домой и воссоздать его может быть другой вариант (если вы хотите избавиться от dotfiles тоже):

 #no apocalyptic threats in this scenario rm -r "$PROJECT_HOME" mkdir "$_" 

Другой способ сделать это:

 rm -r "${somevar:-/tmp/or_this_if_somevar_is_empty}"/* 

Существует много переменных подстановок, один из которых – это когда «somevar» пуст (и в этом случае он пытается удалить /tmp/or_this_if_somevar_is_empty/* )

  • Bash - переменная Shell получает повышенную переменную окружения в процессе child bash
  • Как определить, откуда появилась переменная среды
  • Как печатать переменные и значения оболочки для их копирования и вставки?
  • Что такое переменная среды?
  • лучший способ настроить отдельную среду Linux в ~
  • Почему изменение $ PATH влияет на дочерние оболочки, но с изменением $ foo нет?
  • Почему установка переменной перед командой legal в bash?
  • Есть ли вред в использовании переменных, которые не установлены?
  • Почему некоторые скрипты используют экспорт для системных переменных?
  • Использовать env с переменными окружения из файла
  • Как найти библиотеки, которые эта программа нуждается в переменной окружения?
  • Interesting Posts

    Есть ли возможность отправлять файлы ядра в удаленное место, не сохраняя их локально?

    При резервном копировании, когда будут иметь значение номера inode файловых систем?

    установить процесс по умолчанию и приоритет ввода-вывода в Linux для данного приложения / исполняемого файла

    Ошибка при установке scipy

    Передача содержимого блочного устройства по плохой сети

    Какая опция ядра `.config` вызывает сообщение kmsg / dmesg:« Переключена маршрутизация APIC в физическую плоскость ».

    update-rc.d не меняет порядок

    Почему logcheck сообщает о успешных входах в Орду?

    Как направить вывод журнала определенных единиц в определенный файл?

    Исходный код оригинального Netscape Navigator

    В чем разница между 32-битными PAE и 64-битными ядрами?

    Debian Jessie – Не удается загрузить после установки dm crypt + luks – ошибка grub

    Перенаправить вывод терминала в файл изображения

    SSH: сокращение корневого раздела

    Диагностика узкого места rsync

    Linux и Unix - лучшая ОС в мире.