在 shell 中执行命令之前始终提示用户

在 shell 中执行命令之前始终提示用户

是否存在一个实用程序,在执行命令之前总是提示用户确认,类似于sudo要求输入密码的方式?

答案1

您是否希望它在不输入额外命令的情况下工作,例如

$ rm file

或者只有当用户输入类似以下内容时

$ confirm rm file

或者仅当用户尝试运行某些命令时,例如

$ rm file

但不是

$ echo "Hello"

如果选择 1,则可以使用 zsh 中的 preexec 挂钩或 bash 中的 DEBUG 陷阱来完成。

/etc/bash.bashrc如果是选项 2,请在或其他 shell 启动文件中放入类似这样的内容。

confirm() {
    echo -n "Do you want to run $*? [N/y] "
    read -N 1 REPLY
    echo
    if test "$REPLY" = "y" -o "$REPLY" = "Y"; then
        "$@"
    else
        echo "Cancelled by user"
    fi
}

如果选择 3,您可以修改confirm上面的脚本,或者,某些命令在执行某些操作之前可以选择询问,例如rm -i。您可以 alias rm='rm -i'输入/etc/bash.bashrc

答案2

我玩了一下 bash 并找到了一种可以实现这一点的 hack。

#!/bin/bash

debug_trap () {
    echo "executing $BASH_COMMAND"
    echo "Allow?"
    select choice in yes no
    do
        if [ "$choice" = "yes" ]
        then break
        elif [ "$choice" = "no" ]
        then return 1
        fi
    done
}

shopt -s extdebug
trap debug_trap DEBUG

您可以将此脚本保存在 下,然后confirm-any-command.shsource其保存在您的 中bashrc。它将要求您确认将尝试执行的每个命令。

请注意,这只不过是一个概念验证黑客;我怀疑它以这种形式真的有用。如果你必须确认你输入的每个命令,你很快就会养成在每个命令后自动点击“是”的习惯。你对“命令结束”的心理映射将从仅仅变成Enter,,Enter-yesEnter将把它作为一个整体输入,甚至不要试图花一些时间来验证你真的希望执行此命令。这会适得其反,对您没有帮助。

答案3

首先,打开终端。

然后输入

cd ~
touch .sure
chmod 700 .sure

接下来,打开 .sure 并将其粘贴到里面。

#!/bin/bash --init-file
PS1='> '
alias y='
    $1
    exit
'
alias n='killall Terminal'
echo ''
echo 'Are you sure? Answer y or n.'
echo ''

此后,关闭文件。

~/.sure ; ENTER COMMAND HERE

在继续执行命令之前,这将提示您是否确定。

相关内容