![我可以給空字串起別名嗎?](https://rvso.com/image/1585712/%E6%88%91%E5%8F%AF%E4%BB%A5%E7%B5%A6%E7%A9%BA%E5%AD%97%E4%B8%B2%E8%B5%B7%E5%88%A5%E5%90%8D%E5%97%8E%EF%BC%9F.png)
在 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
。
- 如果最近執行的命令不是
- 每當 shell 即將發出提示時, 指派
command2
給PROMPT_COMMAND
將導致執行。command2
- 如果
command_flag
有非空值,則表示command1
剛剛執行,這表示使用者剛剛執行了命令。在這種情況下,什麼都不做。 - 如果
command_flag
是的話不是有一個非空值,這意味著用戶剛剛點擊Enter。在這種情況下,請執行您想做的操作(例如,清除螢幕)。 - 無論哪種情況,都設定
command_flag
為空白,這樣一切都會在下一個週期中起作用。
- 如果
注意:我很確定這是 bash 特定的(即 POSIX 不支援)。
這個答案基本上是從我的答案複製過來的在 bash 中的指令後面加上垂直空格。也可以看看判斷 PROMPT_COMMAND 中最後一個指令是否為空 對於其他方法。
答案2
TL;DR:Ctrl-l
將清除螢幕而不列印字元或按 Enter 鍵。這可能是最接近您想要的功能的。您可以使命令在每個命令之前或之後運行,也可以為單一字元建立別名。您不能為空字串新增別名。
別名不一定設計為在一行中輸入的全部內容。
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 在這種情況下對空格不敏感。