В 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_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 не чувствителен к пробелам в этом смысле.