识别输入命令的别名

Vis*_*ath 6 command-line shell alias

是否有任何 shell/shellscript 标识我在命令行上输入的命令已经有一个别名。

例如

在外壳上我输入

git checkout master
Run Code Online (Sandbox Code Playgroud)

贝壳印花 "You can use alias you have for that : gcm"

然后 Shell 继续像往常一样检查 master。

我知道alias列出所有可用别名的命令。我希望 shell 在我不使用别名并输入完整命令时提醒我使用别名。

Joe*_*Joe 6

这是一种可能有效的概念方法。

alias命令生成所有别名的列表,每个别名后跟一个=和它的定义。可以通过从第一个空格和第一个=. 第一个之后的所有内容都是=要匹配的定义。这听起来像是在 awk 中使用关联数组很容易处理的事情。

对此有两个并发症(我看到了):

1) 由于定义可以由多个单词组成,因此您必须执行一些操作,例如测量定义的长度减去任何括起来的引号,并将与输入的命令的比较限制为该长度。

2)别名可以容纳一些奇怪的东西。这是我最奇怪的一个(我相信他们会变得更奇怪):

alias pqp='cd ~/pq;[ -n "$(ls)" ] && mprb * || echo "Print Queue Empty"'
Run Code Online (Sandbox Code Playgroud)

这里的重点是别名可以包含(几乎?)shell 想要解释和扩展的所有特殊字符,所以最好用其他东西来编码它,比如 awk 或 Python,你需要比较的两个字符串将被处理作为简单的字符串。

下一个问题是您希望在完成匹配和发出任何消息后实际运行命令。

这里的问题是您在程序中运行的任何内容,即使它只是另一个脚本,也会(通常)在子进程中执行。这意味着当命令终止和子 shell 关闭时,命令的任何(shell 级)副作用都将丢失。最明显的是返回码 ,$?您必须将其捕获并重新发布为实用程序的返回码。

如果别名包含使用source,.命令的调用,那么您将非常不走运,因为在子 shell 中运行它会完全取消预期的副作用。

Shell 包含许多内置命令,例如cd. 其中一些具有与[和等效的程序/usr/bin/test,但有些cd则不具有,即使对于那些具有相同功能的程序,内置版本并不总是具有与外部版本相同的行为和选项。

之所以存在上述问题,是因为最终命令来自当前 shell 级别的标准输入以外的其他地方,因此处理方式不同。这就是AutoKey 之类的东西可以提供帮助的地方。

AutoKey 是一个宏处理器,可用于在 X (gui) 环境中自动执行各种操作。在这种情况下,它可用于在您按下用户定义的热键时调用宏。宏可以读取和分析您要输入的命令行,发出任何消息(关于别名等),然后重新输入命令,就像您在键盘上输入一样。

这里的优点是 Linux(实际上是您的桌面环境/终端模拟器)无法判断它不是您键入的命令,并且一切都在您原始的本机环境中进行,就好像 AutoKey 根本不存在一样。

这种方法的第二个优点是,如果您在没有先按下热键的情况下直接输入命令,则一切照旧,没有开销等。

这让我想到了最后一点,在 stackexchange 和其他地方的不同地方已经详细讨论过。

取任何系统的正常部分并在引擎盖下默认更改它的工作方式而不对用户(在这种情况下是您)完全可见,这几乎总是一个坏主意。

简而言之,如果您自定义系统以非标准方式运行,则会产生两个主要后果。

1) 如果其他人使用该系统(例如帮助您调试问题),他们会遇到意想不到的结果,这可能会产生许多令人不快的后果。

2) 您习惯了修改后的行为,然后(无意识地)期望当您使用另一个未以相同方式定制的系统时它会起作用。

典型的例子是定义一个别名,例如

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

这听起来是个好主意,直​​到您rm在另一个系统上键入,并且当您希望首先收到提示时,文件会立即被删除。

解决这个问题的方法是这样的:

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

如果你输入它,它可以工作,但如果你在另一个系统上输入它,它可能除了发出命令未找到错误之外不会做任何事情。

这是当一些重要的是打破了深夜尤为重要,你没有警告你想成为和你的压力来解决它在现在。那是你真的不想要任何意外行为或必须浪费时间向人们解释的事情。

它的工作方式与使用由热键激活的 AutoKey 宏进行别名检查的方式相同。如果您不通过按热键来激活宏,那么一切都会像任何人所期望的那样工作。一个正确选择的热键可能不会被意外按下,如果习惯性按下另一个系统,可能不会做任何有害的事情。