私は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
-f
rm
mv
元のコマンドにアクセスするには、またはをrm
使用します。\rm
command 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
つまり、機能を使用するのが賢明です。