Ric*_*ano 20 command-line shell alias
例如,我在~/.bashrc文件(或等价物)中看到的一个常见别名是
alias rm='rm -i'
Run Code Online (Sandbox Code Playgroud)
但是,我看到人们建议不要这样做,因为
rm,您无意中删除了一些重要的内容。[1]y或执行,这与整个目的背道而驰。yesrm还有其他理由不建议这样做吗?可能有些程序只是简单地调用rm而不是\rm,并且对它进行别名可能会给他们带来问题?
我rm仅将其用作示例,但我也看到过类似别名cp或被mv别名覆盖的其他命令。就个人而言,我正在慢慢训练自己使用这样的别名来代替rm -i:
alias trash=`mv -v -t $HOME/.Trash`
Run Code Online (Sandbox Code Playgroud)
假设您使用的是 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)
您的问题涵盖了对现有命令的别名的大多数普遍关注,主要问题是乍一看似乎相同的陌生环境可能会产生截然不同的结果。例如,别名rm为rm -i具有良好的意图,但由于您陈述的原因,在实践中是不好的。
“还有其他理由不建议这样做吗?”
当然:
(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)
作为一个极端的例子,让我为标准命令添加别名来说明为什么为标准命令添加别名可能是有害的:
alias ls='rm'
Run Code Online (Sandbox Code Playgroud)
显然,这很糟糕,因为有一天它会引起令人讨厌的意外。同样,用别名替换标准命令最终会在您最意想不到的时候导致不幸的意外。
但让我介绍一个常见的场景,几乎每个 Unix 管理员在职业生涯中都会遇到这种情况:
未来的某一天,你将开始一份新工作,并在别人建立的新系统上工作。周六凌晨三点,你的思维不清醒,很容易犯错误。您的标准环境将不可用。事实上,你是root。
鉴于此,您会记住 'rm不是 ' 的别名吗rm -i?您每次登录时都会检查您的特殊别名吗?如果您更改 root 的环境,您的同事会对您的更改感到满意吗?
老实说,我对此持观望态度。在我的职业生涯中,我曾在数千个系统上工作过,如果我确实修改了所有这些系统上的环境,那么将很难看到其价值。
别名rm是rm -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)
它有更多的危险。
例如,如果你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)
| 归档时间: |
|
| 查看次数: |
5867 次 |
| 最近记录: |