2016-07-29 16 views
1

rm *と入力するとbashを実行したいと思っていますが、rmを実行しています。重要なのは、rm part*などのワイルドカードを使用するたびにrm -iを実行したくないということです。ここまで来ることができます:bash関数の引数として "*"をキャプチャして比較する方法

rm() 
{ 
    if [ "$1" == "*" ]; then 
     rm -i * 
    else 
     rm $1 
    fi 
} 

しかし、私はこれが失敗することを知っています。私が欲しい比較は^*$ですが、私はそれをどのように実装するのか分かりません。

+4

あなた 'rm'関数は' '*すでに展開されているが実行される時まで。 – Paulpro

+3

問題は 'rm'は' * 'を引数として得られないということです。シェルが '*'を引数として展開するファイルの長いリストを取得します。 – chepner

+5

GNU 'rm'は' -I'オプションを持っています。このオプションは3つ以上のファイルを削除するかどうかを尋ねるだけです。 – chepner

答えて

7

あなたのコマンドがあなたのシェルの協力なしにワイルドカードで呼び出されたかどうかを知るには、を知ることができます。

あなたが(他のコマンドと同様)rm *を起動すると、*は、ファイル名、呼び出し前のリストに置き換えられます。したがって、コマンドの内部で、ワイルドカードが与えられたという情報は存在しなくなりました:$1$2などはワイルドカードが展開された名前のリストに置き換えられました。言っ


、我々はシェル機能していることから、当社シェルの協力が実際に提供されています:

rm() { 
    local cmd 
    read -r _ cmd < <(HISTTIMEFORMAT=''; history 1) 
    if [[ $cmd = "rm *" ]]; then 
    command rm -i "[email protected]" 
    else 
    command rm "[email protected]" 
    fi 
} 

このしくみを教えてください。

  • history 1は、シェルの履歴(番号の前に)で最新のコマンドを返します。
  • read -r _ cmdは変数_にその番号を読み取り、変数cmd
  • [[ $cmd = "rm *" ]]に、コマンドラインの残りの部分はその正確な文字列に対してコマンドを比較し
  • command rm ...はバックに再帰を避け、外部rmのコマンドを実行します私たちの機能を再び。
+0

これは、場合によっては機能しない場合があります。私は 'export HISTTIMEFORMAT =" [%F%T] "'をシェルに入れて失敗します。おそらく状態は '[[$ cmd == *" rm * "]]' – anubhava

+0

に変わる可能性があります。現在のフォームでは、 'history 1'が' 49370を出力する '.bashrc'ファイルで、' export HISTTIMEFORMAT = "[%F%T]" 'を実行したので、この関数は' rm -i ... ' [2016-07-29 15:42:52] rm * '。だから、私は[[$ cmd == * rm * "]]'が動くかもしれないと提案したのです。 – anubhava

+1

* facepalm * - '*" rm * "'が最後に固定されていないのを忘れました。うん、それは完璧な意味がある。 –

1

ワイルドカードがあるかどうかわからないので、引数の数を確認してください。例えば

#!/bin/bash 
rm() { 
    if [ "$#" -gt 1 ]; then 
     echo command rm -i "[email protected]" 
    else 
     echo command rm "[email protected]" 
    fi 
} 
rm a b c 
rm a 
+0

...しかし、 '*'が評価されるために 'a 'が得られたのか、それはユーザーが渡したものなのか' a'なので、あなたは分かりません。 –

+2

@CharlesDuffy:そうです。しかし、複数のファイルが削除されることを警告するのがユースケースだと思うので、OPの有効な代替手段かもしれません。 – user000001

+0

私は完全にソリューションの優雅さが大好きです。実際にはこの問題の中心に達しています。複数のファイル(またはそこに置いた数)を削除するのを妨げています。しかし、実際にコマンドをキャプチャする方が全体的に安全だと思います。しかし、素晴らしい仕事! – abalter

関連する問題