.bashrcの「エイリアス」にパラメータを延期する

.bashrcの「エイリアス」にパラメータを延期する

私はLINUX(ubuntu 14)を使用していますが、新しく購入したラップトップではシェルを使用する必要がありました。以前は、Cシェルを使用し、エイリアスを でbash.bashrc.cshrc.bashrc

しかし、うまくいかないのは遅延議論です。たとえば - 私の.cshrcコマンドは次のようになります。

alias rm 'mv -f \!* $HOME/zap'

.bshrcに次のように書くと

alias rm = 'mv -f \!* $HOME/zap'

エラーメッセージの生成:

bash:alias: rm: not found
bash:alias: mv -f \!* $HOME/zap: not found

(このディレクトリはzap私が事前に作成したものです。)

代わりに何を使うべきですか\!*

答え1

このような場合は、エイリアスの代わりにシェル関数を使用する必要があります。より多くのタイピングが必要ですが、より柔軟性を提供します。

function rm {
  if ! test -d "$HOME/zap"; then
    echo "No zap in home" >&2
    return 1
  else
    mv -f -- "$@" "$HOME/zap/"
  fi
}

コマンドラインで$@指定した引数に展開されます。コマンドラインフラグの終わりを通知する必要があります(rmファイルがどこにあるか、可能であり、多くのコマンドラインフラグがとにかく共有されないように)。--rm -f-frmmv

元のコマンドにアクセスするには、またはをrm使用します。\rmcommand rm

存在するかどうかをテストし$HOME/zap、標準エラーにエラーメッセージを出力し、関数がゼロ以外の終了状態で終了することは、必要なものは何でもできることを示しています。明らかに、これを次のように単純化できます。

function rm {
  mv -f -- "$@" "$HOME/zap/"
}

マニュアルbashには次の内容が含まれています。

ほとんどすべての目的で、エイリアスはシェル関数に置き換えられます。

lsエイリアスは、お気に入りのロゴなどにタグを付ける場合にのみ便利です。

答え2

不要なスペースを削除した場合は、このコマンドが機能することを願っています。

$ alias rm='mv -f \!* $HOME/zap'

ファイルを移動せずに何が起こるかを確認するためにエコーを追加しましょう。

$ alias rm='echo mv -f \!* $HOME/zap'
$ rm one two three
mv -f !* /home/immf/zap one two three

cshこれは、cshが使用しているように、bash履歴が書き込みコマンドとは異なる動作をすることを示しています。

エイリアスに履歴参照が含まれている場合、元のコマンドが以前の入力行であったかのように、履歴置換が実行されます。

Bashではそうではありません。さらに重要なのは、bash エイリアスには次の制限があることです。

代替テキストにパラメータを使用するメカニズムはありません。パラメータが必要な場合は、シェル関数を使用する必要があります。

シェルが対話型でない場合、エイリアスは拡張されません。

つまり、現在の行のパラメータは再利用できず、エイリアスは(デフォルトでは)スクリプトに影響を与えません。

ただし、エイリアスの目的は、同じパラメータを再利用し、最後のディレクトリをファイルの移動先として追加することです。

$ alias rm 'echo mv -f \!* $HOME/zap'        ### in csh
$ rm one two 333                             ### in csh
mv -f one two 333 /home/user/zap

これは-t次のオプションを使用して簡単に行うことができますmv(bsdでは利用できませんmv):

$ alias rm='echo mv -f -t "$HOME/zap"'
$ rm one two 333
mv -f -t /home/user/zap one two 333

つまり、機能を使用するのが賢明です。

関連情報