シェルでコマンドを実行する前に、常にユーザーにプロンプ​​トを表示します


10

sudoパスワードを要求するのと同じようなコマンドを実行する前に、常にユーザーに確認を求めるユーティリティはありますか?


1
本当にそれを何かのコマンドにしたいですか?含むcdls
Carsten Thiel、2011年

.bashrcの自分のエイリアスに入れたいのですが。
m33lky 2011年

回答:


9

余分なコマンドを入力せずに機能させますか?

$ rm file

または、ユーザーが次のようなものを入力したときのみ

$ confirm rm file

または、ユーザーが特定のコマンドを実行しようとした場合のみ、たとえば

$ rm file

しかしではない

$ echo "Hello"

オプション1の場合、zshのpreexecフック、またはbashのDEBUGトラップを使用して行うことができます。

オプション2の場合、このようなもの/etc/bash.bashrcまたは他のシェルスタートアップファイルを挿入します。

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.shし、sourceそれはあなたにbashrc。実行しようとする各コマンドの確認を求めます。

これは概念実証のハックに過ぎないことに注意してください。私はそれがこの形で本当に役立つことができるとは思いません。入力するすべてのコマンドを確認する必要がある場合は、各コマンドの後に自動的に「yes」を押す習慣をすぐに身につけます。「コマンドの終わり」のためのあなたの精神的なマッピングは、ちょうどから変更されますEnterEnteryesEnter-あなたは、全体として、それを入力します、でもあなたがいることを検証する上でいくつかの時間を過ごすためにしようとしていない、本当に、このコマンドを実行します。これは逆効果であり、役に立ちません。


上の停止Allow? 1) yes 2) no #? どちらyesno仕事原因無限ループ(Debianの8)
vladkras

@vladkrasを読むhelp select:あなたが入力になっている12ではなく、yesno。無効な入力の自動再試行は意図された動作であり(スクリプト作成者がwhile自分で再発明する必要がなく、簡潔さと明確さを維持する必要があります)、EOF入力はループを終了します。上記のスクリプトが機能することを確認できます。とにかくそれは大まかな概念実証なので、私はそれを修正しません。
ulidtko

それは本当だ。私はあなたのy e s Enter例に混乱しました
vladkras
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.