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

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

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

2 ответа

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

Команда 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, закройте все открытые терминалы и снова откройте терминал, и он должен работать.

Предупреждение, предупреждение, ПРЕДУПРЕЖДЕНИЕ, закрыть все открытые терминалы [ ! d9]!

Пожалуйста, тщательно проконсультируйтесь, прежде чем использовать его вживую. Я положил echo перед фактической командой rm в скрипте (справа в конце), чтобы вы могли протестировать. Это означает, что когда вы запустите его, он отобразит команду вместо фактического ее запуска. Когда вы тщательно протестировали его, отредактируйте свой ~/.bashrc, чтобы удалить слово echo. Это относится к вашему терминалу. Это не относится к root, т. Е. 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
ответ дан 18 July 2018 в 09:12

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

Команда 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, закройте все открытые терминалы и снова откройте терминал, и он должен работать.

Предупреждение, предупреждение, ПРЕДУПРЕЖДЕНИЕ, закрыть все открытые терминалы [ ! d9]!

Пожалуйста, тщательно проконсультируйтесь, прежде чем использовать его вживую. Я положил echo перед фактической командой rm в скрипте (справа в конце), чтобы вы могли протестировать. Это означает, что когда вы запустите его, он отобразит команду вместо фактического ее запуска. Когда вы тщательно протестировали его, отредактируйте свой ~/.bashrc, чтобы удалить слово echo. Это относится к вашему терминалу. Это не относится к root, т. Е. 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
ответ дан 24 July 2018 в 19:16
  • 1
    Привет Пэдди, будет использовать -i помощь? man rm имеет -i prompt before every removal. – DK Bose 13 August 2017 в 08:07
  • 2
    @DKBose Это неплохая идея. Вы можете создать псевдоним в своем ~/.bashrc, как alias rm='rm --interactive'. К сожалению, предупреждение о sudo все еще сохраняется. Я не знаю надежного способа обойти это. – Paddy Landau 13 August 2017 в 11:37

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

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