Сделать псевдоним с завершенной командой

Я ненавижу rm -rf /*, поэтому я хочу что-то повторить вместо того, чтобы бежать rm -rf /*. Как я могу сделать это возможным?

0
задан 2 August 2017 в 15:48

1 ответ

"Ненавистью" я предполагаю, что Вы подразумеваете, что боитесь случайного выполнения этого?

команда rm -r / (с или без -f) предложит Вам:

rm: it is dangerous to operate recursively on `/'
rm: use --no-preserve-root to override this failsafe

, К сожалению, это не проверяет это, когда Вы указываете /*, потому что последний расширен в каждую папку. В то время как большинство папок и их содержание будут безопасны (потому что Вы не использовали sudo), к сожалению, те, которые в Вашей домашней папке, будет удален.

нет никакого простого ответа на это. Вы могли записать функцию в .bashrc, который проверяет на это, но это было бы довольно сложно: функция имела бы к:

  • Проверка опции относительно того, содержали ли они -r, -R или --recursive и использовали ли Вы --no-preserve-root.
  • Взгляд на неопциональные параметры, чтобы узнать, вероятно ли, что Вы использовали /*.

я думаю, что -f или --force может быть проигнорирован, потому что без этого, команда все еще имеет способность нанести ущерб.

я записал сценарий, чтобы сделать точно это. Это ниже. Просто добавьте, что это в конец Вашего файла ~/.bashrc, закрывает все открытые терминалы и вновь открыло терминал, и он должен работать.

Предупреждение, Предупреждение , ПРЕДУПРЕЖДЕНИЕ, ПРЕДУПРЕЖДЕНИЕ !

  1. тест полностью перед использованием его живой.
  2. я поместил echo перед фактическим rm команда в сценарии (прямо в конце), чтобы позволить Вам тестировать. Это означает, что при выполнении его это отобразит команду вместо того, чтобы на самом деле выполнить его. При тестировании его полностью отредактируйте Ваш ~/.bashrc для удаления Word echo.
  3. , к которому Это относится Ваш терминал. Это делает не , относятся к корню, т.е. sudo. Таким образом это будет все еще опустошение причины , если Вы будете работать sudo rm -rf /*. Чтобы заставить его относиться к sudo†¦ хорошо, должен быть путь, но извините, я не знаю как. :( я уверен, что кто-то умный здесь поймет это, в этом случае я могу добавить его к этому ответу. (Существует путь, если можно гарантировать, что sudo будет всегда использовать тот же ${PATH}, но я не думаю, что это верно.)

Вот сценарий:

#---------------------------------------------------------------------------------------------------
#    Amendment to rm
#
#    Check if it is likely that the user called rm on root with recursion but without the option
#    --no-preserve-root
#    If so, display a warning. Otherwise, allow rm to continue unhindered.
#---------------------------------------------------------------------------------------------------


function rm ()
{
    # Extract all of the options and parameters.
    local -r GETOPT="$( getopt --longoptions=force,interactive::,one-file-system,no-preserve-root,recursive,dir,verbose,help,version    \
                               --options=fiIrRdv -- "${@}"
                      )"

    # Replace the current parameters with the interpreted ones from rm.
    eval set -- "${GETOPT}"

    # Define variables to use in the function.
    local -i FILES_COUNT=0                              # The number of files and folders found.
    local ALL_ROOT=true                                 # Assume true unless found otherwise.
    local RECURSIVE_USED=false                          # Unless found true.
    local NO_PRESERVE_ROOT_USED=false                   # Unless found true.
    local PARAM                                         # To hold the parameter being inspected.
    local INTERACTIVE_STATE=false                       # Whether we are expecting an option to --interactive.

    # Run through the parameters to find if we should catch this command.
    for PARAM
    do
        # Handle the option --interactive first.
        if ${INTERACTIVE_STATE}
        then
            INTERACTIVE_STATE=false                     # Turn off the interactive state.

        elif [[ ${PARAM} == '--interactive' ]]
        then
            INTERACTIVE_STATE=true

        elif [[ ${PARAM} == '-r' || ${PARAM} == '-R' || ${PARAM} == '--recursive' ]]
        then
            RECURSIVE_USED=true

        elif [[ ${PARAM} == '--no-preserve-root' ]]
        then
            NO_PRESERVE_ROOT_USED=true

        elif [[ ${PARAM} =~ ^- ]]
        then
             :                                          # Ignore any option that we don't care about.                          

        else
            : $(( ++FILES_COUNT ))                      # Keep count.
            if ! [[ ${PARAM} =~ ^/ ]]
            then
                 ALL_ROOT=false                         # This isn't a root file or folder.
            fi
        fi
    done

    # Is this likely to be the command that we are searching for?
    if (( FILES_COUNT > 0 )) && ${RECURSIVE_USED} && ${ALL_ROOT} && ! ${NO_PRESERVE_ROOT_USED}
    then
        # Yes! Recursive; all root files and folders; and missing no-preserve-root.
        # Leave a message and exit with an error.
        echo 'You are using rm to remove all root files and folders.'         >&2
        echo 'Please use --no-preserve-root if that is really what you want.' >&2
        return 3
    fi

    # No, this is (supposedly) safe. Run the command.
    echo rm "${@}"

} # rm
2
ответ дан 3 August 2017 в 01:48

Другие вопросы по тегам:

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