我可以給空字串起別名嗎?

我可以給空字串起別名嗎?

在 bash 中,你可以給某個東西一個空命令的別名嗎?換句話說,辨識出使用者只Enter在 shell 提示符號下按下了鍵?例如,如果您想使用空白 shell 條目清除螢幕,如何Enterclear命令新增別名?

答案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每次您(使用者)鍵入命令時執行該函數。
    • 如果最近執行的命令不是command2command1則將設定command_flag
  • 每當 shell 即將發出提示時, 指派command2PROMPT_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 在這種情況下對空格不敏感。

相關內容