私はalias
私のrm
注文を持っています。コマンドを実行すると、alias
これが出力されます。
alias rm='rm -i'
これでコマンドを実行すると、期待rm
どおりに機能します。
rm ramesh
rm: remove regular empty file `ramesh'? y
ここで、コマンドの実行時に呼び出されるシステム呼び出しについて学習します。そのために、私はstrace
次のコマンドについて学びました。ここ特定のコマンドの実行時に呼び出されるファイルをリストします。コマンドは次のとおりです。
strace -ff -e trace=file rm ramesh 2>&1
コマンドに設定したエイリアスを無視することを除いて、コマンドはうまく機能しますrm
。ユーザーに尋ねずにファイルを削除します。
ではstrace
、このようにエイリアスを無視しますか?では、なぜそうなのでしょうか?
編集する:
これがそれに関連しているかどうかはわかりませんが、type -a rm
私に与えられた結果は次のとおりです。
rm is aliased to `rm -i'
rm is /bin/rm
それでは、この場合、/bin/rm
削除前にユーザーにメッセージが表示されない理由を考えましたか?
ベストアンサー1
strace
実行されない理由はrm -i
次のとおりです。
echo rm
出力がありませんrm -i
。
エイリアシングは、特定の文字列がコマンドの場所で見つかった場合に自動的に別の文字列に置き換えられるようにするいくつかのシェルの機能です。
存在する:
alias foo='whatever'
foo xxx
シェルはこれを次のように拡張します。
whatever xxx
whatever
そして別の解釈を経てこの場合コマンドが実行されます。
エイリアスは、コマンド位置(コマンド行の最初の単語)にある場合にのみ拡張されます。
zsh
サポートするグローバルニックネーム。
次のことができます。
alias -g rm='rm -i'
しかし、あなたは望んでいません。これはこれを意味するからです。
echo rm
rm -i
たとえば、出力されます。