В этом случае предложение является субоптимальным. Правильный способ переписать этот код (который также не приводит к каким-либо предупреждениям IntelliJ):
src.mapTo(hashSetOf()) { it.length }
Это позволит избежать создания промежуточного списка, который впоследствии будет преобразован в набор; данные будут добавлены в результирующий набор сразу.
Я обнаружил, что большая опасность использования rm в bash состоит в том, что bash обычно не останавливается из-за ошибок. Это означает, что:
cd $SOMEPATH
rm -rf *
Очень опасная комбинация, если не удается изменить каталог. Более безопасный способ:
cd $SOMEPATH && rm -rf *
Это гарантирует, что RF не будет работать, если вы действительно не находитесь в $ SOMEPATH. Это не защищает вас от плохого $ SOMEPATH, но его можно комбинировать с советами других, чтобы сделать ваш скрипт более безопасным.
РЕДАКТИРОВАТЬ: @placeybordeaux хорошо замечает, что если $ SOMEPATH не определен или пуст ] cd
не обрабатывает это как ошибку и возвращает 0. В свете этого этот ответ следует считать небезопасным, если $ SOMEPATH сначала не проверяется как существующий и непустой.
Я думаю, что у команды «rm» есть параметр, позволяющий избежать удаления «/». Проверьте это.
Я бы порекомендовал использовать realpath (1), а не аргумент команды напрямую, чтобы вы могли избежать таких вещей, как /A/B/../ или символических ссылок.
Обычно, когда я разрабатываю команду с такими операциями, как « rm -fr
», я нейтрализую удаление во время разработки. Один из способов сделать это:
RMRF="echo rm -rf"
...
$RMRF "/${PATH1}"
Это показывает мне, что следует удалить, но не удаляет это. Я сделаю ручную очистку, пока что-то находится в разработке - это небольшая плата за то, что я не рискую все испортить.
Обозначение ' "/ $ {PATH1}"
' немного необычно; обычно вы должны гарантировать, что PATH1 просто содержит абсолютный путь.
Использование метасимвола с ' "$ {PATH2} /" *
' неразумно и не нужно. Единственная разница между этим и использованием просто ' "$ {PATH2}"
' заключается в том, что если каталог, указанный в PATH2, содержит какие-либо файлы или каталоги с именами, начинающимися с точки, то эти файлы или каталоги не будут удалены. Такая конструкция маловероятна и довольно хрупкая. Было бы намного проще просто передать PATH2 и позволить рекурсивному удалению выполнить свою работу. Добавление косой черты в конце - не обязательно плохая идея; система должна будет гарантировать, что $ PATH2
содержит имя каталога, а не только имя файла, но дополнительная защита довольно минимальна.
Использование подстановки с ' rm -fr
'- обычно плохая идея. Вы хотите быть точными, ограничивающими и ограничивающими в том, что он делает - чтобы предотвратить несчастные случаи. Конечно, вы никогда не будете запускать команду (сценарий оболочки, которую вы разрабатываете) от имени пользователя root, пока она находится в разработке - это было бы самоубийством. Или,
Тем временем я нашел этот проект perl: http://code.google.com/p/safe-rm/
Если это возможно, вы должны попытаться поместить все в папку с жестко заданным именем, которое вряд ли можно найти где-либо еще в файловой системе, например ' foofolder
». Затем вы можете написать свою функцию rmrf ()
как:
rmrf() {
rm -rf "foofolder/$PATH1"
# or
rm -rf "$PATH1/foofolder"
}
Эта функция не может удалить что-либо, кроме файлов, которые вы хотите.
Вы можете использовать
set -f # cf. help set
, чтобы отключить генерацию имени файла (*).
Существует директива set -u
bash, которая вызывает завершение при использовании неинициализированной переменной. Я прочитал об этом здесь , на примере rm -rf
. Я думаю, это то, что вы ищете. А вот инструкция по установке .
Вам не нужно использовать регулярные выражения.
Just assign the directories you want to protect to a variable and then iterate over the variable. eg:
protected_dirs="/ /bin /usr/bin /home $HOME" for d in $protected_dirs; do if [ "$1" = "$d" ]; then rm=0 break; fi done if [ ${rm:-1} -eq 1 ]; then rm -rf $1 fi