Есть ли в Bash и Zsh режим отображения того, до чего расширяется псевдоним при нажатии Enter?

У вас установлены программы pm -suspend или pm -hibernate ? Эти инструменты работают независимо от systemd, поэтому проблема systemd не затрагивает их. Вы можете получить оба этих инструмента из пакета pm -utils , хотя IDK, если этот пакет доступен в CentOS (, отсутствует в Fedora ), поэтому вам, возможно, придется собрать его из источник. Вы можете получить его из репозитория git :git ://anongit.freedesktop.org/git/pm -utils

Вы также можете попробовать установить пакет uswusp , хотя он также может быть недоступен в репозиториях CenOS. Если вы установите это, вы можете использовать s2disk для перехода в спящий режим и s2ram для перехода в оперативную память. Вы можете получить эту программу на сайте Sourceforge .

Третьим вариантом является указание системе приостановить работу напрямую, без вызова конкретной программы. Это можно сделать, перезаписав файл /sys/power/state с «disk» для перехода в спящий режим или с «mem» для приостановки. Обратите внимание, что этот файл может быть изменен только пользователем root. Вы можете перезаписать его, выполнив что-то вроде sudo sh -c 'printf mem > /sys/power/state'или echo disk | sudo dd status=none of=/sys/power/state.

0
05.04.2020, 19:34
2 ответа

В bash есть функции readline alias-expand-lineи history-and-alias-expand-line, но по умолчанию они не привязаны ни к каким клавишам. Вы можете связать их самостоятельно --пример сControl-T:

bind '"\C-T": history-and-alias-expand-line'

Попытка связать саму Enterбудет беспорядочной, потому что не каждый раз, когда вы нажимаете Enter, вы выполняете команду (, например. а не когда это незавершенный конвейер и т. д. ).

Существует также ловушка DEBUG, но определяющая, действительно ли команда была введена пользователем (, например. не запускается с PROMPT_COMMANDили с подстановки команд в PS1), и вопрос о том, был ли расширен псевдоним -, будет сложным; но если вы не возражаете против печати любой команды перед ее выполнением:

trap 'echo "> $BASH_COMMAND"' DEBUG

bash$ pwd
> pwd

В zsh вы можете просто определить функцию preexec, которая печатает расширенную команду, если она отличается от команды, введенной пользователем:

preexec(){ [ $1 != $2 ] && print -r "> $2" }

zsh$ j
> jobs

Однако имейте в виду, что некоторые трюки с псевдонимом и историей не будут работать должным образом, если принудительно -расширить псевдоним. Например, у меня есть псевдоним cв bash для выполнения вычислений, таких как c 3.17 * 4.2, без необходимости экранировать *, (и т. д.:

alias c='_c=$(fc -nl -0); bc -l <<<${_c#*c} #'

Как только readline расширит его, текущая строка из истории (, возвращенная fc -nl -0), будет расширенной , а не исходной командой, и все развалится.

3
28.04.2021, 23:18

Псевдонимы — это просто простые замены. Если вы хотите сделать что-то более интересное, например напечатать сообщение перед запуском команды, вам нужна более мощная :функция. Если вы хотите, чтобы определение выглядело как определение псевдонима, вы можете определить функцию, которая определяет функцию.

function verbose_alias {
  local name=${1%%=*} expansion=${1#*=}
  eval "function $name {
    printf >&2 '%s is an alias for %s\\n' \"$name\" \"$expansion\";
    $expansion \"\$@\";
  }"
}
verbose_alias dbmigrate='rails db:migrate'
2
28.04.2021, 23:18

Теги

Похожие вопросы