Могу ли я создать псевдоним для пустой строки?

Могу ли я создать псевдоним для пустой строки?

В bash можно ли назначить псевдоним нулевой команде на что-то? Другими словами, распознать, что пользователь нажал только клавишу Enterв приглашении оболочки? Например, если вы хотите очистить экран пустой записью оболочки, как назначить псевдоним 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_COMMANDcommand2
    • Если 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 не чувствителен к пробелам в этом смысле.

Связанный контент