在shell中执行命令之前总是提示用户


10

是否有实用程序在执行类似sudo要求输入密码的命令之前始终提示用户进行确认?


1
您是否真的想要任何命令?包括cdls
Carsten Thiel

我想在.bashrc中使用它自己的别名。
m33lky 2011年

Answers:


9

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

$ rm file

或仅在用户键入类似内容时

$ confirm rm file

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

$ rm file

但不是

$ echo "Hello"

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

如果为选项2,则将这样的内容放入/etc/bash.bashrc其他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


我只想对一个总是令我头疼的命令进行确认。脚本看起来如何?
Danijel

10

我玩了bash有点,并想出了一个办法,可以做到这一点。

#!/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。它将要求您确认要尝试执行的每个命令。

请注意,这仅是概念验证黑客;我怀疑这种形式真的有用吗?如果您必须确认输入的每个命令,您很快就会养成习惯,在每个命令后自动打“ yes”。您的“命令结束”的精神映射将只是改变EnterEnteryesEnter-你会打字它作为一个整体,甚至不试图花一些时间核实你真的想要这个命令来执行。这适得其反,不会对您有帮助。


Allow? 1) yes 2) no #? 既不停止yes也不停止no导致无限循环(Debian 8)
vladkras

@vladkras阅读help select:您应该输入1or 2而不是yesor no。对无效输入的自动重试是预期的行为(这样脚本编写者就不必重新发明while自己,保持简洁明了),并且EOF输入终止循环。知道了这一点,您可以检查自己上面的脚本是否有效。我不会修改它,因为无论如何它是概念的粗略证明。
ulidtko

确实如此。您的y e s Enter榜样让我感到困惑
vladkras 2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.