为什么不建议在标准命令上使用别名?

为什么不建议在标准命令上使用别名?

例如,我在~/.bashrc文件(或等效文件)中看到的常见别名是

alias rm='rm -i'

然而,我看到人们反对这样做,因为

  1. 该别名可能不存在于另一个系统上,并且由于您对 不小心rm,您无意中删除了一些重要的内容。[1]
  2. 通过使用这个别名,您实际上训练自己在每个命令后键入y或,这违背了整个目的。yesrm

还有其他理由建议反对吗?某些程序是否可能只是简单地调用rm而不是调用\rm,并且对其使用别名可能会给它们带来问题?

rm只是简单地使用它作为示例,但我也看到过其他命令,例如别名cpmv别名所涵盖的命令。就我个人而言,我正在慢慢训练自己使用这样的别名来代替rm -i

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

答案1

假设您使用的是 bash,这不会给脚本带来问题,因为非交互式 bash shell 不会获取~/.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

您的问题涵盖了对现有命令的别名的大多数普遍关注,主要问题是乍一看似乎相同的不熟悉的环境可能会产生截然不同的结果。例如,别名rmto 的rm -i意图是好的,但由于您所说的原因,实际上是不好的。

答案2

“还有其他理由建议反对吗?”

当然:

(3) 因为我希望有一天能够为我所建立的基础增添一份力量[------------]以及偏执的人,他们因使用别名标准命令而惩罚他人,尽管别名标准命令是标准命令。

但说真的,这些只是警告。如果您相信自己不会陷入任何厄运的深渊,那么请小心并继续前进。

就我个人而言,我很少为标准命令添加别名;我使用轻微的变化,因为我有点偏执和肛门保守。但我发现的一个很好的用途是关于我经常以 root 或其他用户身份登录的系统,并且有些事情我不想意外/懒惰地以 root 身份运行:

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

或者

alias irc="su irc_user"

答案3

作为一个极端的例子,让我为标准命令添加别名来说明为什么为标准命令添加别名可能是有害的:

alias ls='rm'

显然,这很糟糕,因为有一天它会引起令人讨厌的意外。同样,用别名替换标准命令最终会在您最意想不到的时候导致不幸的意外。

但让我介绍一个常见的场景,几乎每个 Unix 管理员在职业生涯中都会遇到这种情况:

未来的某一天,你将开始一份新工作,并在别人建立的新系统上工作。周六凌晨三点,你的思维不清醒,很容易犯错误。您的标准环境将不可用。事实上,你是root。

鉴于此,您会记住 'rm不是 ' 的别名吗rm -i?您每次登录时都会检查您的特殊别名吗?如果您更改 root 的环境,您的同事会对您的更改感到满意吗?

老实说,我对此持观望态度。在我的职业生涯中,我曾在数千个系统上工作过,如果我确实修改了所有这些系统上的环境,那么将很难看到其价值。

别名rmrm -i很常见的,我已经看到它可以防止许多问题,但它也带来了许多意外和数小时的额外工作来恢复意外删除的文件。

所以现在我尽量避免使用常见系统命令的别名。相反,我使用别名和函数来完成 shell 无法轻松完成的事情。我现在倾向于在别名上附加一个额外的字母,例如:

# 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'

答案4

重命名别名的标准命令(即rm=rm -i)肯定会导致别名不可用的意外。我宁愿不使用这样的,并且(通过几次痛苦的经历;-)我已经习惯于将每个命令读两遍,如果它是rmmv或其他任何潜在的破坏性的东西,则读三次。这样的别名会导致自动“rm foo”ENTER“y”哎呀!!无论如何(并且每次都需要额外的按键)。

但这只是我。如果您不希望在陌生的环境(其他机器、其他用户……)中运行,并且无论您身在何处都可以安装您最喜欢的别名,那就尽情发挥吧。众所周知,Unix 为用户提供了足够多的绳索来自杀。

相关内容