是否有任何要避免的单字符 bash 别名?

qq4*_*qq4 33 shell bash alias

我经常发现自己在制作单个字符别名,因为毕竟它们的存在是为了节省输入时间。我很好奇是否应该避免这种情况。我不知道有任何冲突。

Sté*_*las 38

需要避免的事情:

  • 具有单个字符名称的标准或通用命令:(w显示登录用户的活动)、X(X Window 系统服务器)、R(R 编程语言解释器)、[(类似于test
  • 您的 shell 或普通 shell 的内置函数:[, ., :, -,r
  • shell 关键字:{, },!
  • ?*通配符
  • shell 语法中的特殊字符:`"$&();'#~|\<>,(在某些 shell 中也是^, %)、SPC、TAB、NL(以及其他一些 shell 中的空格)
  • 最好避免使用非 ASCII 字符(因为这些字符根据语言环境具有不同的编码)
  • 最好避免使用控制字符(除了上面已经提到的 TAB 和 NL 之外),因为它们不是那么容易输入,并且取决于上下文,并不总是可见的,或者具有不同的表示形式。只会zsh让您定义和使用 NUL 字符的别名。bash允许您为^A(字节值为 1 的控制字符)定义别名,但不明显使用它。

要查找具有单个字符名称的命令:

  • bash:(compgen -c | grep -x . | sort -u还包括关键字,假设命令名称不包含换行符)

  • zsh:(type -m '?'或者type -pm '?'如果你不想要函数/别名/内置/关键字)。

  • Debian 或衍生产品:在任何具有单字符名称的包中查找任何命令:

    $ apt-file find -x '/s?bin/.$'
    coreutils: /usr/bin/[
    e-wrapper: /usr/bin/e
    python3-q-text-as-data: /usr/bin/q
    r-base-core: /usr/bin/R
    r-base-core: /usr/lib/R/bin/R
    r-cran-littler: /usr/bin/r
    r-cran-littler: /usr/lib/R/site-library/littler/bin/r
    wims: /var/lib/wims/public_html/bin/c
    xserver-xorg-core: /usr/bin/X
    
    Run Code Online (Sandbox Code Playgroud)

  • 什么是`-`?询问原因我在 Bash 中有别名:`alias -- -='cd -'` (5认同)
  • @wjandrea afaicg 如果您有其他别名,其值以空格结尾(导致第二个等 arg 也被评估为别名),这应该只是一个问题。但是问题在于使用了那个错误功能,而不是一个名为 `-` 或 `--` 的别名本身。 (2认同)
  • @wjandrea,`-` 是`zsh` 中内置的一个shell(人们最终倾向于使用这个shell),它用于运行带有`-` 前缀的命令(通常用于启动“登录”模式下的 shell),不是现在最常用的内置命令(现在有几个 shell 也接受 `-l`/`--login` 并且还有 `ARGV0=-sh sh` 或 `(exec - a -sh sh)`),所以我不希望为它创建别名可能会妨碍您。 (2认同)

l0b*_*0b0 19

最简单的方法可能是检查具有该名称的内容是否已经存在。在我的系统上:

$ for char in {A..z}; do type "$char" 2>/dev/null; done
R is /usr/bin/R
X is /usr/bin/X
[ is a shell builtin
l is aliased to `ls -CF'
w is /usr/bin/w
Run Code Online (Sandbox Code Playgroud)

据我所知,这显示了所有相关的碰撞:

  • 其他别名如 l
  • 外壳保留字
  • 职能
  • Shell 内置函数
  • 文件命令,例如w[

  • 使用`zsh`:`type -m '?'` (4认同)

Wat*_*ule 16

致辞:“我很好奇是否应该避免这种情况。”

如其他答案中所述,只要您使用别名覆盖的命令不是您要使用的命令,就不会有技术问题。

像这样使用别名的主要挫折是当您帮助朋友或 ssh 进入您尚未复制 .bashrc 的计算机时。您发展起来的所有肌肉记忆都让您感觉像离开了水的鱼。我觉得这太令人迷惑了,所以我尽量减少我的别名。

  • @qq4 他们关于外国计算机上肌肉记忆的观点似乎是避免冲突别名的有效理由。我认为这使它成为一个有效的答案和贡献。当您定义了使用已知命令名称的别名并且朋友在不知道您的别名的情况下使用您的计算机时,它也可以反向应用。在 WaterMolecule 和这种情况下,都存在运行不应该运行的命令的风险。不是每个人都共享计算机或使用未配置的系统,但如果他们这样做了,那么我认为这可能是一个有效的问题。 (6认同)

JoL*_*JoL 6

我很好奇是否应该避免这种情况。我不知道有任何冲突。

对于您尚不了解的冲突,这并不重要。

别名是一种交互式 shell 配置。他们在脚本中不活跃。如果您定义一个与现有程序同名的别名,则意味着当您亲自在 shell 中键入它时,默认情况下您将调用您的别名而不是其他程序。其他程序不会看到您的别名,因此没有冲突。

例如,如果您不知道该命令X或从不打算直接从 shell 调用它,那么定义 alias 就不是问题X。当另一个程序像startx/ xinitcallX他们不会看到你的别名,所以不会有冲突。


Art*_*nov 5

这个 bash one liner 将向您展示所有单个字符的命令(我不是 bash 专业人士,所以这个脚本可能不是最优雅的):

echo $PATH |
    sed 's/:/\n/g' |
    while read p; do ls "$p" 2>/dev/null; done |
    egrep "^.$" |
    sort -u
Run Code Online (Sandbox Code Playgroud)

在 Fedora 33 上,我得到:

[
w
X
Run Code Online (Sandbox Code Playgroud)


Mat*_*lis 5

这取决于您使用别名的目的(例如,如果您错误地执行了错误的别名会造成多大的问题),以及您犯错的频率。

例如:

  • 使用r='rm -rf *'andt='ls -l *tar*'可能是一个非常糟糕的主意,即使您很少按错键。
  • 使用r='file *.png | grep RGB't='ls -l *tar*'可能不是问题。

在后一种情况下,如果您键入r而不是 (在键盘上关闭,因此容易错误键入) t,您只会得到您不想要的输出,并且您可以轻松键入正确的别名。但是,在前一种情况下,如果您键入r而不是t,则会造成不必要的损坏。

所以重点是:如果您使用单字母别名,请仅将它们用于只读的事物(而不是可能以某种方式更改数据的事物,如果无意中运行会导致您出现问题)