rm コマンドのエイリアスの作成

rm コマンドのエイリアスの作成

rmファイルが最初にコピーされ、次にコマンドが/tmp/recycle_bin実行されたときに削除されるように、rmコマンドのエイリアスを作成します。ところで途中で問題が生じました。

私が行ったステップ:

  1. ~/.bashrcファイルに次のコマンドを作成しました。

    alias rm='cp $@ /tmp/recycle_bin && rm $@'
    
  2. 次のコマンドを使用して実行します。

    . ~/.bashrc
    
  3. 新しい端末を開き、次のコマンドを実行します。

    rm "/home/XXXXX/My_Programs/test_method.py"
    cp: missing destination file operand after '/tmp/recycle_bin'** got this error message 
    

知る必要があります:

  1. パラメータも削除したいファイルとしてrmコマンドに渡されます。 **次の後にターゲットファイルオペランドがありません。というエラーが発生するのはなぜですか/tmp/recycle_bin

  2. エイリアスコマンドの変数$@が埋められていませんか?この状況をデバッグして解決する方法は?

ベストアンサー1

エイリアスは$@パラメータを受け入れることができず、それを使用してこのようにパラメータにアクセスすることはできません。

エイリアス拡張はbash単純なテキスト置換です。存在する場合は、alias rm ='something something'次のようにrm file1 file2実行されます。

something something file1 file2

エイリアスが含まれている場合は、$@コマンドライン引数に展開されます。シェル、エイリアスではありません。

あなたの場合、シェルのコマンドライン引数のリストが空であると仮定すると、エイリアスは

alias rm='cp $@ /tmp/recycle_bin && rm $@'

次のように実行されます。

cp /tmp/recycle_bin && rm file1 file2

rm file1 file2。として呼び出されると、cpユーティリティはオペランドが1つしかないと文句を言います。


代わりにシェル関数を使用できます。

rm () {
    cp -- "$@" "${TMPDIR:-/tmp}/recycle_bin" &&
    command rm -- "$@"
}

指定されたファイルをコピーして$TMPDIR/recycle_bin(設定されていないか空の/tmp/recycle_bin場合TMPDIR)、そのファイルを削除します。このcommandコマンドは、無限再帰を発生させないために使用されます。すべてのパラメータは--オプションではなくファイル名で処理する必要があります。また、ファイル名がスペースに分割されず、引数のファイル名グロービングパターンが目的のファイルを選択しないように、引用符が重要です。いいえ削除したいです。

もっと効率的です(cp+ rm== mv):

rm () {
    mv -- "$@" "${TMPDIR:-/tmp}/recycle_bin"
}

もう少し安全です。 (存在しない場合はごみ箱を作成してください):

rm () {
    mkdir -p "${TMPDIR:-/tmp}/recycle_bin" &&
    mv -- "$@" "${TMPDIR:-/tmp}/recycle_bin"
}

GNUを使用する方がはるかに安全ですmv(名前の競合が発生した場合はごみ箱にバックアップを作成します)。

rm () {
    mkdir -p "${TMPDIR:-/tmp}/recycle_bin" &&
    mv -b -- "$@" "${TMPDIR:-/tmp}/recycle_bin"
}

エイリアスのみ(およびGNUのみ)バリアントについては、関数を使用せずにごみ箱機能を作成する」。

おすすめ記事