我经常发现自己在制作单个字符别名,因为毕竟它们的存在是为了节省输入时间。我很好奇是否应该避免这种情况。我不知道有任何冲突。
Sté*_*las 38
需要避免的事情:
w显示登录用户的活动)、X(X Window 系统服务器)、R(R 编程语言解释器)、[(类似于test)[, ., :, -,r{, },!?和*通配符`"$&();'#~|\<>,(在某些 shell 中也是^, %)、SPC、TAB、NL(以及其他一些 shell 中的空格)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)
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)
据我所知,这显示了所有相关的碰撞:
lw和[Wat*_*ule 16
致辞:“我很好奇是否应该避免这种情况。”
如其他答案中所述,只要您使用别名覆盖的命令不是您要使用的命令,就不会有技术问题。
像这样使用别名的主要挫折是当您帮助朋友或 ssh 进入您尚未复制 .bashrc 的计算机时。您发展起来的所有肌肉记忆都让您感觉像离开了水的鱼。我觉得这太令人迷惑了,所以我尽量减少我的别名。
我很好奇是否应该避免这种情况。我不知道有任何冲突。
对于您尚不了解的冲突,这并不重要。
别名是一种交互式 shell 配置。他们在脚本中不活跃。如果您定义一个与现有程序同名的别名,则意味着当您亲自在 shell 中键入它时,默认情况下您将调用您的别名而不是其他程序。其他程序不会看到您的别名,因此没有冲突。
例如,如果您不知道该命令X或从不打算直接从 shell 调用它,那么定义 alias 就不是问题X。当另一个程序像startx/ xinitcallX他们不会看到你的别名,所以不会有冲突。
这个 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)
这取决于您使用别名的目的(例如,如果您错误地执行了错误的别名会造成多大的问题),以及您犯错的频率。
例如:
r='rm -rf *'andt='ls -l *tar*'可能是一个非常糟糕的主意,即使您很少按错键。r='file *.png | grep RGB'和t='ls -l *tar*'可能不是问题。在后一种情况下,如果您键入r而不是 (在键盘上关闭,因此容易错误键入) t,您只会得到您不想要的输出,并且您可以轻松键入正确的别名。但是,在前一种情况下,如果您键入r而不是t,则会造成不必要的损坏。
所以重点是:如果您使用单字母别名,请仅将它们用于只读的事物(而不是可能以某种方式更改数据的事物,如果无意中运行会导致您出现问题)