標準コマンドのエイリアスが推奨されないのはなぜですか?


19

たとえば、~/.bashrcファイル(または同等のもの)で見た一般的なエイリアスは

alias rm='rm -i'

しかし、私は人々がこれに対して推奨するのを見てきました

  1. エイリアスは別のシステムに存在しない可能性がありrm、で不注意になったため、重要なものをうっかり削除してしまいます。[1]
  2. このエイリアスを使用することにより、実質的にすべてのコマンドを入力yまたは実行するようにトレーニングします。yesrm

これに対して推奨する他の理由はありますか?一部のプログラムは、のrm代わりにを呼び出すだけで\rm、それに対するエイリアスは問題を引き起こす可能性がありますか?

私が使用してrm単に一例として、私はのような他のコマンドを見てきましたcpmvだけでなく、別名でカバー。個人的に、私はゆっくりとこのようなエイリアスを使用するように自分自身を訓練していますrm -i

alias trash=`mv -v -t $HOME/.Trash`

3
デフォルトのエイリアスがrm -iであるシステムにつまずくたびに、自動的に-fフラグを追加するよう少し訓練されます。
ジャンダー

任意のエイリアスrm -iを作成できます。などdelirmなど、あなたがいない必要別名、それまでにrm。これにより、ポイント1が回避され、必要なものを選択的に使用するdelか、または必要にrm応じて、ポイント2もある程度回避されます。
マーティントゥールノイジ

回答:


8

bashを使用していると仮定すると、非対話型のbashシェルはソースにならないため(~/.bashrcまたは~/.bash_profileエイリアスが配置される場所、または別のスクリプトでエイリアスをソースする最初のステップであるため)、スクリプトに問題は発生しません。ただし、スクリプトを調達している場合は問題が発生する可能性があります。

$ alias echo='command echo foo'
$ cat > script << 'EOF'
> #!/bin/bash
> echo bar
> EOF
$ chmod a+x script
$ ./script
bar
$ . ./script
foo bar

あなたの質問は、既存のコマンドに対するエイリアシングに関する一般的な懸念のほとんどをカバーしています。主要な問題は、一見同じように見える不慣れな環境が、大きく異なる結果をもたらす可能性があることです。たとえば、へのエイリアスは良い意図rmrm -i持っていますが、あなたが述べる理由のために実際には悪いです。


7

「これに対して推奨する他の理由はありますか?」

もちろん:

(3)ある日、[-----------]と、標準コマンドのエイリアスは他の人を非難する偏執的な人々によって構築された基盤に追加したいと思っています。 。

しかし真剣に、これらは単なる警告です。運命の穴に落ちないと自分を信じるなら、用心して先に進んでください。

個人的に、私は非常に少数の標準コマンドをエイリアスします。私は少し偏執的でアナルを保持しているので、私はわずかなバリエーションを使用しています。しかし、これについて私が見つけた1つの良い使用法は、rootまたは別のユーザーとして頻繁にログインするシステムに関するものであり、誤って/怠lazにrootとして実行したくないことがいくつかあります:

alias irc="echo \"No you don't!\""

または

alias irc="su irc_user"

4

極端な例として、標準コマンドをエイリアスするだけで、標準コマンドのエイリアスが有害になる理由を説明します。

alias ls='rm'

明らかに、これはいつか厄介な驚きを引き起こすため、悪いことです。同様に、標準のコマンドをエイリアスに置き換えると、最終的には予期せぬことに不幸な驚きにつながります。

しかし、ほぼすべてのUnix管理者がキャリアを進めるにつれて起こる一般的なシナリオを紹介しましょう。

将来のある日、あなたは新しい仕事を始め、他の人によってセットアップされた新しいシステムで働きます。それは土曜日の朝の3時であり、あなたはまっすぐに考えておらず、間違いを犯しがちです。標準環境は使用できません。実際、あなたはルートです。

これを考えると、あなたrmは別名ではないことを覚えていrm -iますか?ボックスにログインするたびに特別なエイリアスをチェックしますか?ルートの環境を変更した場合、同僚はあなたの変更に満足しますか?

正直言って、これについてはfenceにかかっています。私は自分のキャリアで数千のシステムに取り組んできましたが、これらすべてのシステムの環境を変更した場合、その価値を理解することは困難です。

エイリアシングrmにすることはrm -i非常に一般的であり、私はそれが多くの問題を防ぐ見てきましたが、それはまた、多くの驚きと誤って削除したファイルを回復するために余分な作業の時間を引き起こしました。

だから今、私は一般的なシステムコマンドのエイリアスを回避しようとします。代わりに、エイリアスと関数を使用して、シェルでは簡単にできないことを行います。私が今やろうとしているのは、次のような余分な文字をエイリアスに添付することです。

# List long, with color or special characters, depending on OS
alias  ll='ls -l'
# Long, with metacharacters, show dotfiles, don't show . and ..
alias lll='ls -lA'
# Long, with metacharacters, show dotfiles, show . and ..
alias lla='ls -la'
# List just the dotfiles
alias  l.='ls -l -Ad .????*'

# Useful greps
#alias hgrep='history |grep ${*} |grep -v $$'
alias greph='history |grep ${*}'
alias grepp='ps -ef |grep ${*}'

### Highlight some text.
# From http://unix.stackexchange.com/questions/366/convince-grep-to-output-all-lines-not-just-those-with-matches/367#367
highlight () { grep --color -E "$1|$" $2 ; }

そして、新しいプラクティスに適応するには時間がかかるので、おそらく最終的なエイリアスを本当に取り除く必要があります。

# For safety!
alias rm='rm -i'

8
のフラグを覚えておくと、ls10個のエイリアスを覚えるよりも便利かもしれません。
ベルンハルト

本当です。実際、これらのエイリアスを使用することはほとんどありません。なぜ私はまだそれらを持っているのか分かりませんが、より複雑なエイリアス(および関数)を理解するのは難しく、参照に適しています。簡単にするために、おそらくそれらを削除する必要があります。
ステファンLasiewski

「イラスト」(最初の例)はあまり役に立ちません。それは明らかに悪意のあることであり、システムのブービートラップが有害である可能性があることはわかっています。あなたのrm->のrm -i例の方がはるかに優れています。別の良いものはrmをエイリアスして物事を入れるものです~/.trash
derobert

1
@Bernhard:True。ただし、エイリアスの入力は高速です。(しかし、10は多すぎます。)
エマニュエルベルク

2
@StefanLasiewski:ヒント:純粋に審美的な理由から、表示されないものを削除しないでください。彼らが積極的にあなたを邪魔しない限り、彼らはそのままにしておきます。それはセットアップに何時間も費やした後、ものを削除するような非常に速い行為です。そして、もしあなたがそれを後悔しているなら、あなたは彼らをたださせるだけでなく、馬鹿のように感じます。
エマニュエルベルク

4

それにはもっと危険があります。

たとえばshell-command、Emacsで使用する場合、「your」コマンド(またはalias)を受け取ると思うかもしれませんが、lsエイリアスの設定を忘れるまで何度も端末でエイリアスを打つ必要はありません。他のコマンドと同じように...)-実際には(Emacsに戻って)、(エイリアスなしの)コマンドを取得します。Emacsは問題なくそれを実行しますので、あなたは今起こったことを盲目にするかもしれません!

さまざまなコンピューターやシステム.rcについては、すべてのファイルを個別にセットアップするのが面倒だと思う場合、そのようなファイルを1つだけ持つことができますが、if調整する節があります。

たとえば、関数を記述するときに各関数を評価するのではなく、関数のいずれかで問題が発生したときに、最後に「ブラックリスト」に追加します。

if [[ `uname` == "SunOS" ]]; then
  unset -f mic cpkeep mcp mcph cpindex cpconf # not for Solaris
fi

3

エイリアス(つまりrm=rm -i)で標準コマンドの名前を変更すると、エイリアスが使用できない場合に確実にサプライズが発生する可能性があります。私はそのようなものを使わないことを好み、(いくつかの苦い、苦い経験によって;-)各コマンドを2回読むことに慣れており、それがrmまたはmv他の何かが潜在的に破壊的な3回である場合。そして、そのようなエイリアスは自動的に "rm foo" ENTER "y"につながりますとにかく(そして毎回余分なキープレスがかかります)。

しかし、それは私だけです。異質な環境(他のマシン、他のユーザーなど)で実行することを期待しておらず、どこにいてもお気に入りのエイリアスをインストールできる場合は、ワイルドになります。Unixは、ユーザーが自分の足を撃つのに十分なロープをユーザーに提供することで有名です。


0

他の答えは良いが、彼らはそれがあなたにどのように影響するかだけを見る。

@Stephan Laswieskiの答えを少し頭に入れてみましょう。

あなたが全知ではないと仮定すると、他の誰かがあなたのユーザーアカウントで作業するか、何かをする方法についてあなたに助言する必要があるかもしれません。

その後、彼らが何かをしたり、それをするようにあなたに言ったとき、それは期待通りに動作しないかもしれません。

せいぜい、何が起こったのかを説明するのに時間を浪費する必要があります(その場にいて、エイリアスが問題の原因であると記憶または把握できる場合)。

最悪の場合、他の回答の1つであるエイリアスls = 'rm -rf'の例のねじれを参照してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.