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

Ric*_*ano 20 command-line shell alias

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

alias rm='rm -i'
Run Code Online (Sandbox Code Playgroud)

但是,我看到人们建议不要这样做,因为

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

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

rm仅将其用作示例,但我也看到过类似别名cp或被mv别名覆盖的其他命令。就个人而言,我正在慢慢训练自己使用这样的别名来代替rm -i

alias trash=`mv -v -t $HOME/.Trash`
Run Code Online (Sandbox Code Playgroud)

Chr*_*own 9

假设您使用的是 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
Run Code Online (Sandbox Code Playgroud)

您的问题涵盖了对现有命令的别名的大多数普遍关注,主要问题是乍一看似乎相同的陌生环境可能会产生截然不同的结果。例如,别名rmrm -i具有良好的意图,但由于您陈述的原因,在实践中是不好的。


gol*_*cks 8

“还有其他理由不建议这样做吗?”

当然:

(3) 因为有朝一日我希望能在[-----------]和偏执的人建立的基础上加进标准命令别名,即使别名标准命令是标准命令.

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

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

alias irc="echo \"No you don't!\""
Run Code Online (Sandbox Code Playgroud)

或者

alias irc="su irc_user"
Run Code Online (Sandbox Code Playgroud)


Ste*_*ski 6

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

alias ls='rm'
Run Code Online (Sandbox Code Playgroud)

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

但让我介绍一个常见的场景,几乎每个 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 ; }
Run Code Online (Sandbox Code Playgroud)

也许我真的应该摆脱我的最终别名,因为适应新的做法需要时间:

# For safety!
alias rm='rm -i'
Run Code Online (Sandbox Code Playgroud)

  • 记住“ls”的标志可能比记住十个别名更方便。 (8认同)
  • @StefanLasiewski:提示:永远不要出于纯粹美观的原因删除未显示的内容。让他们留下来,除非他们主动打扰你。在花了几个小时设置好东西之后,删除东西的速度实在是太快了;如果你后悔了,你就会觉得自己像个白痴,因为你没有顺其自然。 (2认同)

Ema*_*erg 5

它有更多的危险。

例如,如果你shell-command在 Emacs 中使用,你可能认为你得到了“你的”命令(或alias,但你不必ls在终端中多次敲击别名,然后忘记设置别名,想想它和任何其他命令一样......)——事实上(回到 Emacs),你会得到(无别名的)命令。Emacs 会毫无问题地执行它,所以你甚至可能对刚刚发生的事情视而不见!

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

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

if [[ `uname` == "SunOS" ]]; then
  unset -f mic cpkeep mcp mcph cpindex cpconf # not for Solaris
fi
Run Code Online (Sandbox Code Playgroud)