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


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,并且通过有选择地使用delrm根据您的需要,也可以在某种程度上绕过点2。
马丁·图尔诺伊

Answers:


8

假设您使用的是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

您的问题涵盖了有关对现有命令使用别名的大多数普遍关注的问题,主要问题是乍一看似乎相同的陌生环境可能会产生完全不同的结果。例如,混叠rmrm -i有良好的愿望,但糟糕的是在实践中你的状态的原因。


7

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

当然:

(3)因为有一天我希望增加[-----------]和偏执的人建立的基础,这些人为别名使用标准命令而对其他人进行惩罚,尽管别名标准命令是标准的。

严重的是,这些只是警告。如果您相信自己不会陷入任何厄运,那么请当心并继续前进。

就我个人而言,我很少使用标准命令。我使用一些细微的变化,因为我只是偏执狂和肛门保持型。但是我发现这有一个很好的用途,它适用于我经常以root或其他用户身份登录的系统,并且有些事情我不想意外/懒惰地以root身份运行:

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

要么

alias irc="su irc_user"

4

举一个极端的例子,让我仅对标准命令进行别名,以说明为什么对标准命令进行别名可能有害:

alias ls='rm'

显然,这很糟糕,因为有一天会引起令人讨厌的惊喜。同样,用别名替换标准命令最终会在您最不期望的情况下导致不幸的意外。

但是,让我提出一个普遍的情况,几乎每一个Unix管理员在职业生涯中都会遇到这种情况:

在将来的某一天,您将开始一项新工作,并将在其他人建立的新系统上工作。星期六是凌晨三点,您并没有直截了当,容易出错。您的标准环境将不可用。实际上,您是root。

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

老实说,我对此持反对态度。在我的职业生涯中,我已经开发了成千上万个系统,如果我确实在所有这些系统上修改了环境,那么将很难看到其价值。

混叠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'

8
记住标记ls可能比记住十个别名更方便。
Bernhard 2013年

非常真实 实际上,我很少再使用这些别名。我不确定为什么仍要保留它们,除了更复杂的别名(和函数)之外,很难弄清楚它们是否可供参考。为简单起见,我可能应该删除它们。
Stefan Lasiewski

“插图”(第一个示例)并不是真正有用的。这显然是恶意的,而且我们知道诱骗系统是有害的。您的rm-> rm -i示例要好得多。另一个好人是将rm别名的东西放在~/.trash
德罗伯特

1
@Bernhard:是的,但是别名的键入速度更快。(但无论如何,十个都太多了。)
伊曼纽尔·伯格

2
@StefanLasiewski:提示:出于纯粹的审美原因,切勿删除未显示的内容。让他们留下来,除非他们积极地打扰您。花费数小时设置好东西后,这样的动作非常快。如果您后悔,您会觉得自己是个白痴,不仅让他们失望。
伊曼纽尔·贝格2013年

4

还有更多的危险。

例如,如果您shell-command在Emacs中使用,您可能会认为您得到了“您的”命令(或别名,但是您不必ls在终端中多次击中别名,而不必忘记设置别名的全部事情,而是想着就像其他命令一样...)-实际上(返回Emacs),您得到了(未混淆)命令。Emacs将毫无问题地执行它,因此您甚至可能对所发生的事情视而不见!

对于不同的计算机和/或系统,如果您认为.rc为所有文件和系统设置单个文件太繁琐,则可以只拥有一个这样的文件,但if要定制一些子句。

例如,当您遇到每个函数的问题时,不要在编写每个函数时对其进行评估,而是将它们添加到“黑名单”中,最后:

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

3

用别名(即rm=rm -i重命名标准命令肯定会导致别名不可用的意外情况。我不喜欢使用这样的,和(由几个苦,苦的经历;-)我已经成为acustomed阅读每个命令两次,如果它是rmmv或其他任何潜在的破坏性三次。这样的别名会导致自动“ rm foo” ENTER“ y” 糟糕!无论如何(并且每次都要花费额外的按键)。

但这就是我。如果您不希望在外来环境(其他计算机,其他用户,...)中运行,并且无论身在何处都可以安装自己喜欢的别名,那就疯了。众所周知,Unix可为用户提供足够的绳索来射击自己的脚。


0

其他答案很好,但它们都只看它如何影响您。

让我稍微谈谈@Stephan Laswieski的答案。

假设您不是无所不知,则可能需要让其他人在您的用户帐户上工作或建议您如何做某事。

然后,当他们做某事或告诉您去做时,它可能无法按预期工作。

充其量,您将不得不浪费时间向他们解释发生了什么(如果您就在那里并且可以记住或弄清楚别名是引起问题的原因)。

最坏的情况是,在其他答案之一中看到该示例的错误之处:别名ls ='rm -rf'。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.