在 bash 中,可以将空命令别名为某个命令吗?换句话说,识别出用户Enter在 shell 提示符下按下了某个键?例如,如果要使用空白 shell 条目清除屏幕,如何将命令别名为该Enter命令clear
?
答案1
以下是如何(有效地)将空命令别名为某个命令:
将以下内容放入您的.bashrc
:
command1()
{
if [ "$BASH_COMMAND" != command2 ]
then
command_flag=1
fi
return 0
}
trap command1 debug
command2()
{
if [ ! "$command_flag" ]
then
echo "clear" # Put whatever command(s) you want here.
fi
command_flag=
}
PROMPT_COMMAND=command2
如果有必要,请用您不太可能随机输入的单词替换command1
和。command2
trap command1 debug
将导致command1
每次您(用户)键入命令时执行该函数。- 如果最近要执行的命令不是
command2
,command1
则会设置command_flag
。
- 如果最近要执行的命令不是
- 分配
command2
给PROMPT_COMMAND
将导致command2
在 shell 即将发出提示时执行。- 如果
command_flag
具有非空值,则表示command1
刚刚执行,这意味着用户刚刚运行了命令。在这种情况下,什么也不做。 - 如果
command_flag
不是具有非空白值,这意味着用户刚刚点击了Enter。在这种情况下,执行您想要的操作(例如,清除屏幕)。 - 无论哪种情况,都设置
command_flag
为空白,这样一切都将在下一个周期内正常工作。
- 如果
注意:我很确定这是 bash 特有的(即不受 POSIX 支持)。
这个答案基本上是从我的答案中复制而来在 bash 中的命令后添加垂直空格。 也可以看看判断 PROMPT_COMMAND 中最后一个命令是否为空 其他方法。
答案2
TL;DR:Ctrl-l
将清除屏幕而不打印字符或按回车键。这可能是最接近您所需功能的功能。您可以让命令在每个命令之前或之后运行,也可以为单个字符创建别名。您不能为空字符串创建别名。
别名不一定设计为在一行中输入的整个内容。
alias ll='ls -l'
就是一个很好的例子。你可以这样做ll /path/to/other/dir
,并取得成果。
别名的作用实际上是将命令行中输入的第一个单词更改为你指定的值
别名要起作用的唯一要求是它后面必须跟一个非打印字符(空格/制表符/换行符)。在我们的例子中,ll
本身是有效的,但实际上ll-/mypath/
不是,因为可以(并且经常这样做)将一些字符作为另一个命令的开头(即,alias gi='git init'
只能精确解析gi
,而不是git
,这是大多数人想要和期望的)作为别名。
不可能将某个东西设置为空字符串的别名,因为那将位于每一个命令行输入。
如果您希望每次都运行某个命令,则可以使用PS0
(假设 bash 版本足够新)在每个命令之前运行某个命令或PROMPT_COMMAND
在每个命令之后运行某个命令。例如:
PROMPT_COMMAND='echo $?'
将会回显您运行的每个命令后的返回值。
如果且仅当您在命令行中输入了空行时,Bash 才没有很好的方法来完成操作。Bash 在这方面对空格不敏感。