1

rm特定の状況で except の使用を無効にしたい。removeファイルで呼び出される関数を作成しました.shが、実際に呼び出す前に課したい特定のチェックを通過しますrm。ただし、ターミナルに移動して、rmを使用するのではなく、単に関数を呼び出すこともできremoveます。rmによって呼び出された場合を除いて、機能を無効にする方法はありremoveますか? rm端末にログインするユーザーにとって機能が「存在しない」ようにしたいのですが、「存在する」のは削除機能だけです。

たぶんさらに一歩進んで、ユーザーがそれを呼び出すrmと、使用するようにというステートメントが画面に出力されますremove

より広範な質問として、特定の状況を除いて端末コマンドを無効にする方法はありますか? root を必要とする のエイリアスを作成できることはわかっていrmますが、それは簡単で不便な方法です。

#!/bin/bash

function rm {
  if [ $# -le 0 ]; then
    echo "Error: no arguments specified."
  else
    hasDir=0
    for arg in "$@"; do
      if [ -d "$arg" ]; then hasDir=1; fi
    done

    ac="Action canceled."
    resp=("y" "n" "e")

    sure=" "
    while [ "$sure" != "y" ] && [ "$sure" != "n" ]; do
      read -p "PERMANENT ACTION.  Are you sure? (y/n): " sure
    done

    if [ "$sure" == "n" ]; then echo "$ac"; return; fi


    if [ $hasDir -eq 1 ]; then
      direc=" "
      validResp=0
      while [ $validResp -eq 0 ]; do
        read -p "Remove all sub-directories? (y/n/e): " direc
        for ans in "${resp[@]}"; do
          if [ "$direc" == "$ans" ]; then validResp=1; fi
        done
      done

      if [ "$direc" == "e" ]; then echo "$ac"; return; fi
    else
      direc="n"
    fi



    check=" "
    validResp=0
    while [ $validResp -eq 0 ]; do
      read -p "Verify removal of each file? (y/n): " check
      for ans in "${resp[@]}"; do
        if [ "$check" == "$ans" ]; then validResp=1; fi
      done
    done

    if [ "$check" == "e" ]; then echo "$ac"; return; fi


    if [ "$direc" == "n" ]; then
      if [ "$check" == "n" ]; then
        for file in "$@"; do
          if [ ! -d "$file" ]; then command rm -f "$file"; fi
        done
      else 
        for file in "$@"; do
          if [ ! -d "$file" ]; then command rm -i "$file"; fi
        done
      fi
    else
      if [ "$check" == "n" ]; then
        command rm -rf "$@"
      else
        command rm -ir "$@"
      fi
    fi
  fi    
}
4

4 に答える 4

5

rm(または他のコマンドを)上書きできます。commandビルトインにより、必要に応じて元のコマンドにアクセスできます。

rm () {
    # Do something in addition to removing the file

    command rm "$@"
}

commandシェル関数のルックアップを無効にします。

于 2013-02-16T00:21:19.123 に答える
1

のすべての使用法をキャプチャする場合rmは、1つの方法があります。ただし、これは汚い、推奨されない方法であることを述べておかなければなりません。

mv /bin/rm /bin/rm.bak
cp my_rm_script /bin/rm

my_rm_scriptには、/ bin/rmではなく/bin/rm.bakへの呼び出しが含まれている必要があります。

これにより、コマンドへのすべての呼び出しがキャプチャされますrm

ただし、これは、バイナリの名前も重要なbusyboxタイプのアーキテクチャでは機能しません。

于 2013-02-16T08:21:46.673 に答える
0

dpkg-divertシステムに別のものをインストールするために使用できrmます。

シェル スクリプトを使用した例については、この記事「バイナリを dpkg-divert に置き換える」も参照してください。

于 2013-02-16T00:40:09.737 に答える
0

これが解決策です。少し奇妙な方法ですが、希望どおりに機能します。

directoryホームフォルダーに作成します

$~ mkdir ~/myrm

$~ cd ~/myrm

バイナリへのシンボリック リンクrmを作成するremove

$~ ln -s /path/to/remove rm

上記のコマンドは、基本的に を呼び出すことによって呼び出すリンクrmを作成します。else の使用時に実行権限が与えられていることを確認してくださいremoveremovermrm

$~ chmod 0777 rm

今度はパスを$PATH変数に入れます。

$~ PATH=~/myrm/:$PATH

ではないことを確認して~/myrm:$PATHください$PATH:myrm。したがって、呼び出すたびに、ディレクトリ内rmを検索して呼び出します。rm~/myrm

于 2013-02-16T08:12:19.607 に答える