Как установить команду (команды), которая выполняется перед каждой подсказкой?

Я думаю, что самое соответствующее место было бы

/usr/lib/yourLibraryName

Посмотрите Файловую систему Стандарт Hierarchie для получения дополнительной информации.

1
05.10.2012, 01:04
3 ответа

Если все, что Вы хотите, является большим фиксированным предупреждением, то просто добавляют его к подсказке:

red=$(tput setaf 1; tput smso; tput bold) reset_color=$(tput sgr0)
PS1='
${red}[THIS IS A PRODUCTION SYSTEM!!]${reset_color}

rest of the prompt$ '

В современном (отправляют 1995), реализации ksh (ksh93, mksh), $PS1 подвергается замене команды и расширению параметра, таким образом, можно сделать вещи как:

function mywarning {
  tput setaf 1; tput bold
  date "+it's %T, please remember it's a production system"
  tput sgr0
}

PS1='$(mywarning)# '

В ksh88 (который 10-е Соляриса /usr/bin/ksh все еще), только параметр и расширение тильды сделаны в подсказке.

Необходимо вернуться к умным приемам для чего-либо, полагают в подсказке. И затем, Вы вполне ограничены в том, что можно сделать.

В то время как арифметическое расширение не выполняется, поскольку можно развернуть вещи как ${array[expr]}, у Вас могут быть арифметические выражения (здесь expr) оцененный. Поскольку присвоения (хотя только к численным значениям) могут быть сделаны в арифметических выражениях, который дает некоторые возможности сделать необычные вещи.

Можно использовать это для последующей обработки динамических переменных как $SECONDS, $PWD, $?, $!, $RANDOM, $_.

Например, можно получить дату HH:MM:SS с:

typeset -Z2 _h _m _s
eval "$(date +'SECONDS=$((%H*3600+%M*60+%S))')"
PS1='${z[(_h=SECONDS/3600)+(_m=(SECONDS/60)%60)+(_s=SECONDS%60)]}${_h}:${_m}:${_s} $ '

Можно добавить жир, предупреждающий каждые 5 подсказок путем выполнения:

set -A warn '' '
[THIS IS A PRODUCTION SYSTEM!!]
' '' '' ''
PS1='${warn[warn_count=(warn_count+1)%5]}# '

Я не думаю, что можно было выполнить команду перед каждой подсказкой (почтовая проверка сделана внутренне ksh), но у Вас может быть тот, бежит за каждой командой с прерыванием ОТЛАДКИ:

trap 'my-command' DEBUG

Обратите внимание, что это сделано после каждой простой команды в каждой подоболочке.

Так, например, в:

for f in *; do :; done

my-command будет выполняться так же много раз, как существуют файлы в текущем каталоге.

В:

: | :

Это выполняется 3 раза... Таким образом, в действительности это не действительно практично.

3
27.01.2020, 23:29
  • 1
    Это только работает в определенных версиях ksh: M-12/28/93e работы - M-11/16/88f не делают. –  DarkHeart 15.08.2014, 06:35
  • 2
    @DarkHeart, Действительно, я обновил ответ. –  Stéphane Chazelas 15.08.2014, 12:27

Я просто поместил его в /etc/profile, или /etc/issue. Иногда отображение содержания файла проблемы выключено, но я все еще думал бы, что это - хорошее напоминание.

Изменение содержания $PS1 переменная в порядке, я предполагаю, Вы могли бы хотеть все еще распечатать некоторые предупреждения /etc/profile. Так как это - производственная система, нормально редактировать те файлы, с тех пор здесь, Вы хотите продержаться изменения в системе. (Обычно, я отговорил бы от изменения тех файлов и использования пользовательских файлов вместо этого.)

0
27.01.2020, 23:29

Вы можете увидеть хост, время, местоположение и git-ветку с помощью:

HOST='\033[02;36m\]\h'; HOST=' '$HOST
TIME='\033[01;31m\]\t \033[01;32m\]'
LOCATION=' \033[01;34m\]`pwd | sed "s#\(/[^/]\{1,\}/[^/]\{1,\}/[^/]\{1,\}/\).*\(/[^/]\{1,\}/[^/]\{1,\}\)/\{0,1\}#\1_\2#g"`'
BRANCH=' \033[00;33m\]$(git_branch)\[\033[00m\]\n\$ '
PS1=$TIME$USER$HOST$LOCATION$BRANCH

Вы можете изменить любую из этих переменных, e. g. host.

Если вы хотите выполнить команду, используйте обратные ссылки - these ```

0
27.01.2020, 23:29

Теги

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