Como definir o (s) comando (s) que são executados antes de todos os comandos?

1

Eu costumava saber disso, mas esqueci: quero executar um comando ou alguns comandos antes de cada prompt. Quando eu estou em nossa caixa PROD, eu quero um lembrete grande e gordo acima de cada prompt que diz * VOCÊ ESTÁ EM PROD * e talvez outra coisa ou duas. Atualmente, acho que é como o e-mail é verificado, mas não consigo lembrar como essa configuração está definida.

Usando o ksh e o Solaris 5.10

Alguma ideia?

Obrigado

    
por amphibient 04.10.2012 / 18:34

3 respostas

3

Se tudo o que você quer é um aviso fixo grande e gordo, basta adicioná-lo ao prompt:

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$ '

Em implementações modernas (pós-1995) de ksh (ksh93, mksh), $PS1 está sujeito a substituição de comandos e expansão de parâmetros, assim você pode fazer coisas como:

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

PS1='$(mywarning)# '

Em ksh88 (que o /usr/bin/ksh do Solaris 10 ainda é), apenas o parâmetro e a expansão do til são feitos no prompt.

Você tem que reverter para truques inteligentes para qualquer coisa chique no prompt. E então, você é bastante limitado no que você pode fazer.

Enquanto a expansão aritmética não é executada, como você pode expandir coisas como ${array[expr]} , você pode ter expressões aritméticas (aqui expr ) avaliadas. Como atribuições (embora apenas a valores numéricos) podem ser feitas em expressões aritméticas, isso dá algumas oportunidades para fazer coisas extravagantes.

Você pode usar isso para pós-processar variáveis dinâmicas como $SECONDS , $PWD , $? , $! , $RANDOM , $_ .

Por exemplo, você pode obter uma data de HH: MM: SS com:

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} $ '

Você pode adicionar seu aviso de gordura a cada 5 prompts fazendo:

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

Eu não acho que você pode ter um comando executado antes de cada prompt (a verificação de e-mail é feita internamente por ksh ), mas você pode ter uma execução após cada comando com a interceptação DEBUG:

trap 'my-command' DEBUG

Observe que isso é feito após cada comando simples em cada subshell.

Então, por exemplo, em:

for f in *; do :; done

my-command será executado quantas vezes houver arquivos no diretório atual.

Em:

: | :

É executado 3 vezes ... Então, na verdade, não é realmente prático.

    
por 04.10.2012 / 22:31
0

Eu simplesmente colocaria em /etc/profile ou /etc/issue . Às vezes, a exibição do conteúdo do arquivo de problemas está desativada, mas ainda acho que é um bom lembrete.

Alterar o conteúdo da variável $PS1 está ok, imagino, talvez você ainda queira imprimir alguns avisos /etc/profile . Já que é um sistema de produção, está tudo bem editar esses arquivos, pois aqui você quer mudanças duradouras no sistema. (Normalmente, aconselho não alterar esses arquivos e usar arquivos do usuário).

    
por 05.10.2012 / 00:23
0

Você pode ver o host, a hora, os locais e o branch git com:

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

Você pode modificar qualquer um deles, por exemplo host.

Se você deseja executar um comando, use backtics - these ''

    
por 15.08.2014 / 12:02

Tags