Безопасная комната-rf функционирует в сценарии оболочки

В этом случае предложение является субоптимальным. Правильный способ переписать этот код (который также не приводит к каким-либо предупреждениям IntelliJ):

src.mapTo(hashSetOf()) { it.length }

Это позволит избежать создания промежуточного списка, который впоследствии будет преобразован в набор; данные будут добавлены в результирующий набор сразу.

7
задан 5 revs 23 May 2017 в 12:26
поделиться

9 ответов

Я обнаружил, что большая опасность использования rm в bash состоит в том, что bash обычно не останавливается из-за ошибок. Это означает, что:

cd $SOMEPATH
rm -rf *

Очень опасная комбинация, если не удается изменить каталог. Более безопасный способ:

cd $SOMEPATH && rm -rf *

Это гарантирует, что RF не будет работать, если вы действительно не находитесь в $ SOMEPATH. Это не защищает вас от плохого $ SOMEPATH, но его можно комбинировать с советами других, чтобы сделать ваш скрипт более безопасным.

РЕДАКТИРОВАТЬ: @placeybordeaux хорошо замечает, что если $ SOMEPATH не определен или пуст ] cd не обрабатывает это как ошибку и возвращает 0. В свете этого этот ответ следует считать небезопасным, если $ SOMEPATH сначала не проверяется как существующий и непустой.

7
ответ дан 6 December 2019 в 08:45
поделиться

Я думаю, что у команды «rm» есть параметр, позволяющий избежать удаления «/». Проверьте это.

2
ответ дан 6 December 2019 в 08:45
поделиться

Я бы порекомендовал использовать realpath (1), а не аргумент команды напрямую, чтобы вы могли избежать таких вещей, как /A/B/../ или символических ссылок.

2
ответ дан 6 December 2019 в 08:45
поделиться

Обычно, когда я разрабатываю команду с такими операциями, как « rm -fr », я нейтрализую удаление во время разработки. Один из способов сделать это:

RMRF="echo rm -rf"
...
$RMRF "/${PATH1}"

Это показывает мне, что следует удалить, но не удаляет это. Я сделаю ручную очистку, пока что-то находится в разработке - это небольшая плата за то, что я не рискую все испортить.

Обозначение ' "/ $ {PATH1}" ' немного необычно; обычно вы должны гарантировать, что PATH1 просто содержит абсолютный путь.

Использование метасимвола с ' "$ {PATH2} /" * ' неразумно и не нужно. Единственная разница между этим и использованием просто ' "$ {PATH2}" ' заключается в том, что если каталог, указанный в PATH2, содержит какие-либо файлы или каталоги с именами, начинающимися с точки, то эти файлы или каталоги не будут удалены. Такая конструкция маловероятна и довольно хрупкая. Было бы намного проще просто передать PATH2 и позволить рекурсивному удалению выполнить свою работу. Добавление косой черты в конце - не обязательно плохая идея; система должна будет гарантировать, что $ PATH2 содержит имя каталога, а не только имя файла, но дополнительная защита довольно минимальна.

Использование подстановки с ' rm -fr '- обычно плохая идея. Вы хотите быть точными, ограничивающими и ограничивающими в том, что он делает - чтобы предотвратить несчастные случаи. Конечно, вы никогда не будете запускать команду (сценарий оболочки, которую вы разрабатываете) от имени пользователя root, пока она находится в разработке - это было бы самоубийством. Или,

2
ответ дан 6 December 2019 в 08:45
поделиться

Тем временем я нашел этот проект perl: http://code.google.com/p/safe-rm/

1
ответ дан 6 December 2019 в 08:45
поделиться

Если это возможно, вы должны попытаться поместить все в папку с жестко заданным именем, которое вряд ли можно найти где-либо еще в файловой системе, например ' foofolder ». Затем вы можете написать свою функцию rmrf () как:

rmrf() {
    rm -rf "foofolder/$PATH1"
    # or
    rm -rf "$PATH1/foofolder"
}

Эта функция не может удалить что-либо, кроме файлов, которые вы хотите.

1
ответ дан 6 December 2019 в 08:45
поделиться

Вы можете использовать

set -f    # cf. help set 

, чтобы отключить генерацию имени файла (*).

1
ответ дан 6 December 2019 в 08:45
поделиться

Существует директива set -u bash, которая вызывает завершение при использовании неинициализированной переменной. Я прочитал об этом здесь , на примере rm -rf . Я думаю, это то, что вы ищете. А вот инструкция по установке .

4
ответ дан 6 December 2019 в 08:45
поделиться

Вам не нужно использовать регулярные выражения.
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
1
ответ дан 6 December 2019 в 08:45
поделиться
Другие вопросы по тегам:

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