プロが教えるわが家の防犯対策術!

UNIX/Linuxの「エイリアス置換」のところで教えてください。
書籍に次のような記述がありました。
(なお、¥は「バックスラシュ」の意味です。)

エイリアス置換をエスケープするには、コマンドの前に「¥」をつけます。たとえば、このようにrmが「rm -i」にエイリアスされている場合に、エイリアスされたrmではなく、本来のrmを実行したいならば、次のようにrmの前に「¥」をつけます。
% \rm test.txt
エイリアス置換はそれ以上エイリアス置換ができなくなるまで繰り替えします。そのため、エイリアスの定義によってはエイリアス置換が止まらなくなることもあります。これを防ぐには、エイリアス置換の必要のないコマンドはエイリアス置換をエスケープしておくといいでしょう。
% alias rm  \\rm -i
% alias
rm (\rm -i)

【質問1】この2つめの段落の「エイリアス置換が止まらなくなることもあります」とはどのような事を指しているのでしょうか。
【質問2】このrmは「エイリアス置換をエスケープ」しているはずなのですが、試してみると、-iコマンドが生きていました。つまり、
alias rm   \\rm  -i
と、
alias rm   rm  -i
は同じ動きでした。何がいけないのでしょうか。

A 回答 (2件)

最初の語だけは特別扱いのようです。


alias echo echo A
echo
は A を表示しますが、
alias echo pwd ';' echo A
echo
はループになります。
alias echo pwd ';' \\echo A
echo
だと、ループにならず、pwd と echo A が実行されます。

csh も昔からあるコマンドなので昔はその書籍通り、alias rm rm -i でもループしていたのでしょう。ループを防ぐための他のやり方として、alias rm /bin/rm -i というのを見た事もあります。
    • good
    • 0
この回答へのお礼

ご丁寧にありがとうございました。助かりました。

お礼日時:2005/07/20 08:33

書式からして csh 系だと思うのでそれに従って:


1 の方:
例えば
alias rm rm -i
としたとします. これは, 「コマンドラインが rm という単語で始まっていたら, それを rm -i で置き換える」という意味です. そこで
rm foo
と入力すると, これは rm という単語で始まっているので
rm -i foo
と置き換えられます. ところが, これもやはり rm という単語で始まっているのでさらに
rm -i -i foo
に置き換わります. さらに (以下略)

2 の方:
普通は
alias rm \\rm -i
だと
rm foo
という入力に対して
\rm -i foo
に置き換えるんですが, これは rm という単語で始まっているとはみなさないのでここで置き換えが終了します. 一方, 最初から
\rm foo
と入力すると全く置き換えはされません. この場合には -i を付けずに実行されます.

なお, csh はかなりアドホックな (あるいは「いきあたりばったりな」) 実装になっているので,
alias rm rm -i
でも 1 で述べたような問題は発生しない*かも*しれません.
    • good
    • 0
この回答へのお礼

ご丁寧にありがとうございました。いわれてみればこういうことなんですね。

お礼日時:2005/07/20 08:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!