De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
Colaboração: Fernando M. Roxo da Motta
Data de Publicação: 16 de maio de 2014
De tempos em tempos vemos aqui na Dicas-L uma pilha de dicas realmente valiosas, outras, como algumas das minhas, nem tanto. Hoje eu estava lendo um artigo sobre artimanhas, ou artes e manhas, com o prompt do Bash. Sim, embora muitos não acreditem, ainda existem muitos usuários Linux que utilizam a tal "tela preta" que aterroriza os mais arraigados usuários de interfaces gráficas. Não só isto, existem até aqueles que são capazes de usar o vi[|m] para escrever uma dica!
Sabem como é, uma mente desocupada é um caldeirão em ebulição. Não que não tenha nada para fazer, na verdade tenho muito o que fazer, mas estou com preguiça e a hora do almoço está chegando, então vou fingir que estou trabalhando escrevendo uma dica. ;)
Sobre o que falar? Bem, eu lembrei que quando eu trabalhava em uma
grande empresa brasileira de petróleo, eu usava um ambiente bem complexo.
Haviam dezenas de aplicativos específicos da minha atuação profissional.
Mais ainda, estas aplicações rodavam em estações Unix (os mais diversos
"sabores") e Linux. O diretório pessoal era distribuído via NFS,
portanto o mesmo ~/.profile
era executado em todas as plataformas. Cada
aplicação necessitava um conjunto de variáveis de ambientes para a sua
execução. A consequência disto vocês podem imaginar, um ~/.profile
quilométrico e completamente desorganizado, um pesadelo evitado por 11
entre 10 profissionais de suporte, principalmente porque os .profile
eram pessoais
, ou seja todos eram iguaizinhos, só que diferentes. :P
Ok, hoje já não trabalho naquele ambiente, mas ainda tenho vários aplicativos ou ambientes que precisam de um conjunto de variáveis de ambientes específicas. Como resolver isto?
Vocês já repararam na configuração do sistema qual a estrutura do
/etc/profile
e do /etc/profile.d
? Ou mesmo a estrutura dos
diretórios /etc/rc.*
. Resolvi usar algo similar para mim.
Primeiro passo, alterei meu ~/.profile
para :
# # Não use #! se a sua SHELL não é Bash # # Carrega as configurações necessárias para seção interativa # # Para debug # set -xv # # Se quiser cancelar a execução sem desistir do "login": #return # MEU_OS="`uname`" TTY="`tty|cut -d\/ -f 2`" # # No caso do administrador tentar forçar um csh ou similar. # Se possível, troca a SHELL pelo Bash # if [ "$MEU_OS" = "Linux" -a \ "$TTY" = "dev" -a \ -z "$BASH_VERSION" ]; then export SHELL=/bin/bash exec bash --login fi # # Aqui começa a festa. # for s in $HOME/.profile.d/*.sh; do if [ -x $s ]; then . $s fi done # # Desliga o debug # set +xv # # agora deixa de brincadeira e vamos trabalhar, po !! #
Ok, parte da jogada já foi feita agora vamos organizar a brincadeira.
Nesta segunda etapa vamos criar o diretório ~/.profile.d
.
$ mkdir -p ~/.profile.d $ cd ~/.profile.d
Vamos criar um script base para a nossa estrutura de configurações. Um modelo poderia ser:
# # Não usar "#!", use o interpretador ativo. # # script modelo para as configurações. # # Função: Configuração do# # Recomendações: Colocar avisos específicos para evitar estragar tudo. # # Criação: data da criação (dããããããã) # # Debug: # set -xv # # Colocar aqui as configurações específicas. # # # Desliga o Debug # set +xv
Salve este arquivo com o nome de modelo.sh
, NÃO dê autorização de
execução para ele.
Como criar os outros arquivos? Bem, eu uso um padrão de nome que é
NN<oqueestouconfigurando>.sh
.
Por exemplo, por conta da história que contei lá em cima o primeiro
arquivo criado se chamava 00sys.sh
. O 00
(zerozero) vai garantir que
ele vai ser o primeiro a ser executado. Eu o uso para configurações
específicas do systema, por exemplo:
# # Não usar "#!", use o interpretador ativo. # # Função: Configuração de variáveis específicas do sistema. # # Criação: 25/04/1997 # # Alterado: 05/10/1999 # - Alterada a forma "export VAR=..." para "VAR=..." "EXPORT VAR" # O ksh do IRIX não gosta disto. # # Alterado: 12/03/2001 # - Incluida a chamada do fortune # # Alterado: 07/05/2004 # - Incluida a chamada 'cal' # # Alterado: 17/08/2007 # - Alterada a chamada do fortune. # # Debug: # set -xv # #---------------------------------------------------------- # Configurações iniciais ... #---------------------------------------------------------- # # verifica onde estou ... # export MEU_SYS=`uname -s` export NODE=`uname -n | cut -f1 -d\.` # # verifica de onde vim ... # temp="`who am i`" temp="`echo $temp`" # # Estou local ou remoto ? # # O "who am i" no Irix parece ter o "cerebro danificado" e nao informa # de onde o indigitado esta' se logando. Mas, pelo menos na unica # que consegui logar, existia uma variavel "REMOTEHOST" com a informacao. # if [ "$MEU_SYS" = "IRIX" -o "$MEU_SYS" = "IRIX64" ]; then DONDE="$REMOTEHOST" else DONDE="`echo $temp | cut -f2 -d\( | cut -f1 -d\)`" fi primc="`echo $DONDE | cut -c1`" if [ ! -z "$WHOAMI" ]; then DONDE=$WHOAMI fi # # Se $DONDE == $temp | $DONDE(1:1) == ':' entao esta' local ... # if [ "$DONDE" = "$temp" -o \ "$primc" = ":" ]; then DONDE="$NODE" fi # # Se o endereco nao foi resolvido, entao ou o DISPLAY esta' ok # ou entao eu vim da rede de micros. # # Mas algumas ( quase todas ) so' escrevem parte do nome, por isto # vamos tentar determinar qual deve ser o nome correto. # case "$primc" in [0-9]) echo "O seu endereco nao foi resolvido pelo sistema." ;; *) DONDE="`echo $DONDE | cut -f1 -d\.`" ;; esac # export DONDE # # if [ -z "$DISPLAY" -a "$TERM" != "linux" ]; then export DISPLAY=$DONDE:0.0 echo echo "DISPLAY=$DISPLAY" else echo echo "default DISPLAY=$DISPLAY" fi # # Se estiver vindo do Zaurus if [ "$DONDE" = "zaurus" ]; then stty cols 42 fi # ========== este arquivo é longo, é só para dar idéia do que é # # Os terminais no Irix parecem nao obedecer ao ^C. Para esta joca funcionar, # estabelece claramente o que se quer. # if [ "$SYS" = "IRIX" -o "$SYS" = "IRIX64" ]; then stty intr "^C" 2>/dev/null fi # # # O telnet do rWindow$ 95 se identifica como 'ANSI' e as maquinas # Unix nao costumam ter este terminal no terminfo/termcap. # A substituicao por vt100 parece funcionar a contento. # if [ "$TERM" = "ANSI" ]; then export TERM=vt100 fi # # O CDE usa um tal de "dtterm", trata este caso. # if [ "$TERM" = "dtterm" ]; then export TERM=xterm fi # ========== este arquivo é longo, é só para dar idéia do que é # #---------------------------------------------------------- # Para saber o que me espera, lista o uptime... #---------------------------------------------------------- # uptime # #acpitool # echo "" cal # # Ninguém é de ferro... fortune -sa # set +xv
Ok, concordo que este exemplo pode ser meio usual, mas acredito que alguns que leem estas dicas ainda enfrentam este tipo de problema e podem se beneficiar da magia negra acima. Na verdade este script é muuuuito longo, cuidando de casos como uso de console de sistemas específicos e mais um mundo de tralhas.
Em seguida eu tenho um que cuida do meu conforto pessoal, o
10ambiente.sh
:
# # Não usar "#!", use o interpretador ativo. # # Função: Configuração de variáveis para meu conforto pessoal # # Criação: 25/04/1997 # #============ cortada uma longa série ========8<----------------- # # Alterado: 17/08/2010 # - Alterada a definição do prompt para o caso de acesso vi 'ssh'. # # Debug: # set -xv # #---------------------------------------------------------- # The different colours as variables #---------------------------------------------------------- R="\033[01;31m" # Red G="\033[01;32m" # Green Y="\033[01;33m" # Yellow B="\033[01;34m" # Blue M="\033[01;35m" # Magenta C="\033[01;36m" # Cyan W="\033[01;37m" # White D="\033[0m" # Back to default # # Exemplo de uso. # #HOSTNAME=`uname -n` #KERNEL=`uname -r` #CPU=`uname -p` #ARCH=`uname -m` #echo -e "$R#===================================================#" #echo -e " $W Welcome $B $USER $W to $B $HOSTNAME " #echo -e " $R ARCH $W= $ARCH " #echo -e " $R KERNEL $W= $KERNEL " #echo -e " $R CPU $W= $CPU " #echo -e "$R#==================================================#" # # #---------------------------------------------------------- # Variáveis especificas para aplicações #---------------------------------------------------------- # # # para uso com o PYTHON # #export PYTHONPATH=$HOME/desenv/python/lib/python # Path for manual pages if [ -n "$PYTHONPATH" ]; then export PYTHONPATH=$PYTHONPATH:/lib/python2.7/site-packages:/desenv/python/lib/python else export PYTHONPATH=$HOME/lib/python2.7/site-packages:/desenv/python/lib/python fi # # para uso com o MPI # if [ -f /usr/lib/liblam.a ]; then export LAMRSH="ssh -x" export LAMMPIF77=gfortran fi # #---------------------------------------------------------- # Variáveis de ambiente genéricas #---------------------------------------------------------- # # Meu prompt: # | hostname:$PWD # | $ _ # # Normal : Cyan # SSH : Verde # Android: Amarelo # Root : Vermelho # # PS1="\n\\[$R\\]$NODE:\$PWD \n#\\[$D\\] " # # if [ ! -z "$SSH_CONNECTION" ]; then PS1="\n\\[$G\\]$NODE:\$PWD \n$\\[$D\\] " elif [ "$TERM" = "screen" -o "$TERM" = "screen-bce" ]; then PS1="\n\\[$Y\\]$NODE:\$PWD \n$\\[$D\\] " else PS1="\n\\[$C\\]$NODE:\$PWD \n$\\[$D\\] " fi # # Só de sacanagem... # export PS1="\n\\[$G\\]C:${PWD////\\\\}>\\[$D\\] " # # #---------------------------------------------------------- # VISUAL="`which vim 2>/dev/null`" if [ "$?" != "0" ]; then VISUAL=vi fi EDITOR=$VISUAL export EDITOR VISUAL # # Para o ScientificLinux 4.4 # # Usa rubout como erase char stty erase ^? 2>/dev/null #---------------------------------------------------------- # # Qual o PATH para as funcoes da Korn Shell ? # FPATH=$HOME/.functions # # O BASH parece não ter este recurso, vamos na mão grande como # faz o /etc/profile : for i in $HOME/.functions/*.sh ; do if [ -x $i ]; then . $i fi done # #---------------------------------------------------------- # # Constrói o PATH # echo $PATH | grep sbin > /dev/null if [ "$?" != "0" ]; then PATH=$PATH:/sbin:/usr/sbin fi echo $PATH | grep $LOGNAME > /dev/null if [ "$?" != "0" ]; then PATH=$PATH:$HOME/bin fi echo $PATH | grep "$HOME/bin/$MEU_OS" > /dev/null if [ "$?" != "0" ]; then PATH=$PATH:$HOME/bin/$MEU_OS fi # Este é para o emulador SIMHV echo $PATH | grep "$HOME/bin/simhv" > /dev/null if [ "$?" != "0" ]; then PATH=$PATH:$HOME/bin/simhv fi echo $PATH | grep "bin/Linux64" > /dev/null if [ "$?" != "0" -a "$ARCH" = "x86_64" ]; then PATH=$PATH:$HOME/bin/Linux64 fi echo $PATH | grep "[^a-zA-Z0-9]\.[^a-zA-Z0-9]" > /dev/null if [ "$?" != "0" ]; then PATH=$PATH:. fi if [ "$MEU_OS" = "SunOS" ]; then echo $PATH | grep "/usr/ccs/bin" > /dev/null if [ "$?" != "0" ]; then PATH=$PATH:/usr/ccs/bin fi fi echo $PATH | grep "/sismica/bin" > /dev/null if [ $? -ne 0 ]; then #{ if [ -d /sismica/bin ]; then #{ PATH=$PATH:/sismica/bin if [ -d /sismica/bin/$MEU_OS ]; then #{ PATH=$PATH:/sismica/bin/$MEU_OS fi #} fi #} fi #} # Ninguém é de ferro. ;) echo $PATH | grep "/usr/games" > /dev/null if [ $? -ne 0 ]; then #{ PATH=$PATH:/usr/games fi #} echo $PATH | grep "/usr/share/games" > /dev/null if [ $? -ne 0 ]; then #{ PATH=$PATH:/usr/share/games fi #} export PATH # # Tratamento do Mail # export MAIL=$HOME/mail/IN_
if [ ! -z "$MAILMSG" ]; then # This is at Shell startup. In normal echo "$MAILMSG" # operation, the Shell checks fi # periodically. # # Proxies # #export http_proxy="http://proxy:" #export ftp_proxy="http://proxy: " #export gopher_proxy="http://proxy: " #export wais_proxy="http://proxy: " # #export no_proxy="localhost,192.168.*,10.*" # # #---------------------------------------------------------- # Servicos Intra/Internet #---------------------------------------------------------- # # Para o irc # #export IRCSERVER=irc.brasnet.org #export IRCNICK=SeiLa #export IRCNAME="Ergo Sum" # # para o News # .export NNTPSERVER=news.uol.com.br # # para o WWW # export WWW_HOME="file:///usr/share/xubuntu-docs/index.html" export WWW_HOME # # # BROWSER settings.... # #export BROWSER="netscape -raise -remote \"openURL(%s,new-window)\":lynx" #export BROWSER="netscape -n %s:lynx" #export BROWSER="MozillaFirebird %s:lynx" export BROWSER="firefox %s:lynx" # # #-------------------------------------------------------------- # # Define impressora padrão #export PRINTER=PDF # #-------------------------------------------------------------- # # # outras configurações set -o ignoreeof set -o vi #set -o noclobber # nao escreve por cima de file existente. if [ "$meu_SYS" = "Linux" -a ! -z "$KSH_VERSION" ]; then export HISTFILE=$HOME/.sh_history export HISTSIZE=5000 fi # #export HISTSIZE=1000 # lembra os últimos 1000 comandos # Esta é da Dicas-L export HISTSIZE=1000000 HISTFILESIZE=1000000 # 1M comandos!!!! export HISTCONTROL=ignoredups # o shell history nao precisa guardar duplicatas. # # permite mensagens. # mesg y 2>/dev/null # umask 022 # # Cores para o 'ls' # if [ -f $HOME/.dir_colors ]; then eval `dircolors $HOME/.dir_colors` fi # # Limites para a secao... # # Evita geração de core dump ulimit -c 0 2>/dev/null # Alguns sistemas reclamam disto. # set +xv # #
Eu sei que este foi muuuuito longo, mas é para mostrar um pouco do que aconteceu quando os computadores deixaram de ser movidos a lenha. :)
Ok, se eu tenho que configurar uma aplicação, como eu faço?
Como tenho muitos aplicativos e pacotes da área de geofísica (ninguém é
perfeito) eu os instalo todos sob um diretório, por isto eu tenho uma
configuração geral para todas as aplicações de geofísica no script
45geof.sh
:
# # Leave the above line as is, don't #! it. # nome : geof.sh # author : Fernando M. Roxo da Motta# description : Script for geophysics environment configuration # changelog : # 14/01/2004 - 1st version # # Just for debug, leave commented # set -xv # if [ -z "$GEOFDIR" ]; then # # # Put your geophysics directory tree root here : export GEOFDIR=/usr/local/geof # if [ -d $GEOFDIR ]; then PATH=$GEOFDIR/bin:$PATH export PATH fi # fi # set +xv
Um exemplo específico, para o pacote Seismic Unix (SU) do Center for Wave Phenomena (CWP) eu uso o
# # Leave the above line as is, don't #! it. # nome : cwp.sh # author : Fernando M. Roxo da Motta# description : Script for CWP/SU environment configuration # See: http://cwpcodes.mines.edu/ # changelog : # 14/01/2004 - 1st version # # Just for debug, leave commented # set -xv # CWPROOT=$GEOFDIR/cwp if [ -d "$CWPROOT" ]; then # # # Put your CWP/SU directory tree root here : export CWPROOT # if [ -d $CWPROOT ]; then export PATH=$CWPROOT/bin:$PATH # # Define o visualizador de PS # type -p gv > /dev/null 2>&1 if [ $? -eq 0 ]; then export PSPREVIEWER="gv -" fi # export MEUCWP=$HOME/geof/cwp # # Para o pacote TkSu # export TKSU_PATH=$MEUCWP/tksu export TKSU_TMPDIR=/tmp/tksu.$LOGNAME if [ ! -d $TKSU_TMPDIR ]; then mkdir -p $TKSU_TMPDIR chmod 1777 $TKSU_TMPDIR fi fi # fi # set +xv
Isto pode se repetir "ad nauseam", eu tenho 15 scripts "50xxxx.sh
",
todos eles para aplicações ou pacotes de geofísica. Alguns destes não
estão em uso. Como faço para inibir a execução de um deles? Basta tirar
a autoridade de execução:
$ cd ~/.profile.d $ chmod -x 50scriptdesb.sh
Por último, e não menos importante, eu tenho as definições de alias para
as minhas seções no "80aliases.sh
":
# # Não usar "#!", use o interpretador ativo. # # Função: Configuração de alias de comandos # # Criação: 25/04/1997 # #============ cortada uma longa série ========8<----------------- # # # Debug: # set -xv # # # Definição de aliases genéricos # # if [ "$MEU_OS" = "Linux" ]; then # alias l="ls -lA --color=tty" alias ls="ls -FA --color=tty" alias lh="ls -lhA --color=tty" alias bc="bc -l ~/.bc/*" # #---------------------------------------------------------- # alias file default do CL 8 #---------------------------------------------------------- # alias minicom='minicom -con -L' alias ts='tail -f /var/log/syslog' alias tm='tail -f /var/log/messages' alias tmm='tail -f /var/log/mail.log' alias tms='tail -f /var/log/secure' alias cds='cd /etc/rc.d/init.d ; ls' #alias fd='mount /dev/fd0 /mnt/floppy ; cd /mnt/floppy ; ls' #alias ufd='cd /mnt ; umount floppy ; ls' #alias ldir='mount /mnt/floppy ; l /mnt/floppy ; umount /mnt/floppy' else alias l="ls -lA" alias ls="ls -FA" alias bc="bc -l" fi # # --------------------------------------------------------- # alias apt-get='apt-fast' # # --------------------------------------------------------- # nada=`type mpif90 > /dev/null 2>&1` RC1=$? nada=`type mpif77 > /dev/null 2>&1` RC2=$? if [ $RC1 -ne 0 -a $RC2 -eq 0 ]; then alias mpif90="~/bin/mpif90.sh" fi unset nada RC1 RC2 # # --------------------------------------------------------- # Para montagem de dispositivos MTPfs # http://www.omgubuntu.co.uk/2011/12/how-to-connect-your-android-ice-cream-sandwich-phone-to-ubuntu-for-file-access # alias razr-connect="mtpfs -o allow_other /media/RzrI" alias razr-disconnect="fusermount -u /media/RzrI" # # --------------------------------------------------------- # Sou preguiçoso, este é o comando que mais uso. :p alias x=exit # alias rm="rm -i" #http://www.dicas-l.com.br/arquivo/aumente_sua_produtividade_com_aliases_inteligentes.php # #alias mkdir='mkdir -pv' # $TYPE vi >/dev/null 2>&1 if [ $? -ne 0 ]; then alias vi="$VISUAL" fi # alias xlinks="links2 -driver x" # # Abre um terminal na máquina remota... alias maisum="xterm -geometry 80x25 -ls -sl 1000 -fn 7x14 -sb -fg gray95 -bg black -title \"$LOGNAME\"@\"`hostname -s`\"&" # # dica : #xterm -fn fixed -bg black -fg yellow -geom 80x25-0-0 -e /bin/sh -c "who; read" # # Alguns históricos # if [ "$MEU_OS" != "Linux" ]; then alias more="more -dw" # more que da' dica e nao sai se nao pedir alias uso="ps -aF runame,tty,pid,time,vsz,pcpu,comm" # ps macetoso fi alias usov="ps avw|sort -n -k 5" # ps macetoso alias xload="xload -geometry 73x73 -fg Blue -bg Gray75 -jumpscroll 1 -hl red -update 5 -label $NODE &" alias xman="xman -bothshown -pagesize 750x750 -notopbox" # #---------------------------------------------------------------------- # alias xdos="xdosemu" #alias quake="quake -mode 8" #---------------------------------------------------------------------- # alias tn=telnet # # # Alguns destinos #alias bw1="ssh no1" #alias bw3="ssh no3" # #alias linux02="ssh linux02" #alias linux09="ssh linux09" #alias linux51="ssh linux51" #alias roxo2="ssh roxo@uml2" #alias roxo3="ssh roxo@uml3" #alias roxo4="ssh roxo@uml4" #alias roxo5="ssh roxo@uml5" # alias bacurau="ssh bacurau" # # Só por preguiça. alias cls=clear # Por alguma razão vivo perdendo a tecla "d" alias c=cd alias mc='. /usr/share/mc/bin/mc-wrapper.sh' # Inclui as funções ZZ #source /usr/bin/funcoeszz #export ZZPATH=/usr/bin/funcoeszz # # Shortcut via tab para o libreoofice alias ooffice=libreoffice # # Emulador to Spectrum function xspect() { export LD_PRELOAD=libpulsedsp.so /usr/bin/xspect } # # Isto não é um alias, é uma função para obter a conversão entre moedas. # Uso: xcc Val Org Dst # Onde: Val é o valor a converter. 1 fornece a taxa de conversão. # Org Moeda original de Val. # Dst Moeda de destino da conversão. # Ex: xcc 1 usd brl # converte de US$ para BRL. # xcc 1 usd arl # converte de US$ para Peso Argentino. # xcc 1 eur usd # converte de Euro para US$. # xcc() { wget -qO- "http://www.google.com/finance/converter?a=$1&from=$2&to=$3&hl=es" | sed '/res/!d;s/<[^>]*>//g'; } # set +xv
É claro que isto tudo é um apanhado de scripts para organizar um ambiente bem complexo, mas espero que possa dar ideias para administradores que têm que dar conta de uma situação destas.
Eu mostrei aqui como eu uso na minha máquina, se você tem uma rede complexa em que os seus usuários montam o diretório pessoal via NFS e 'automount', você pode manter no mesmo sistema de arquivos do $HOME de seus usuários uma estrutura só para estas configurações. Ainda mais, você pode ter um subdiretório para cada grupo de usuários e colocar as configurações específicas nestes subdiretórios.
Resumo da história, nada é tão simples que não possa ser complicado, mas pode-se complicar de forma organizada.
Espero que isto ajude.
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários