% Linux Installation and Getting Started    -*- TeX -*-
% environment.tex
% Copyright (c) 1992, 1993 by Matt Welsh, Larry Greenfield and Karl Fogel
%
% This file is freely redistributable, but you must preserve this copyright 
% notice on all copies, and it must be distributed only as part of "Linux 
% Installation and Getting Started". This file's use is covered by
% the copyright for the entire document, in the file "copyright.tex".
%
% Traducci\'on al espa\~nol por Eduardo Lluna Gil <elluna@aii.upv.es>
% $Log: environment.tex,v $
% Revision 0.5.0.1  1996/02/10 23:45:14  rcamus
% Primera beta publica
%
%


\section{Personalizando su entorno}

\index{entorno!personalizaci\'on|(}

El int\'erprete de comandos proporciona muchos mecanismos para 
personalizar su entorno de trabajo. Como hemos mencionado antes, el 
int\'erprete de comandos es m\'as que un mero int\'erprete---es 
tambi\'en un poderoso lenguaje de programaci\'on. Aunque escribir guiones 
del int\'erprete de comandos es una tarea extensa, nos gustar\'{\i}a 
introducirle algunas formas en las que puede simplificar su trabajo en 
un sistema UNIX mediante el uso de caracter\'{\i}sticas avanzadas del 
int\'erprete.

Como mencionamos antes, diferentes int\'erpretes usan diferentes sintaxis para
la ejecuci\'on de guiones. Por ejemplo, Tcsh usa una notaci\'on al estilo C,
mientras que Bourne usa otro tipo de sintaxis. En esta secci\'on no nos
fijaremos en las diferencias entre los dos y supondremos que los guiones son
escritos con la sintaxis del int\'erprete de comandos Bourne.

\subsection{Guiones del int\'erprete de comandos}\label{sec-shell-script}
\index{guiones de int\'erprete de comandos!defined}
\index{ordenes!agrupando con guiones}

Supongamos que usa una serie de comandos a menudo, y le gustar\'{\i}a 
acortar el tiempo requerido para teclear agrup\'andolos en una \'unica 
``orden''. Por ejemplo, las \'ordenes
\begin{tscreen}
/home/larry\# {\em cat chapter1 chapter2 chapter3 $>$ book} \\
/home/larry\# {\em wc -l book} \\
/home/larry\# {\em lp book}
\end{tscreen}
concatenar\'an los ficheros {\tt chapter1}, {\tt chapter2} y {\tt chapter3} y
guardar\'a el resultado en el fichero {\tt book}. Entonces, se mostrar\'a el
recuento del n\'umero de l\'{\i}neas del fichero {\tt book} y finalmente se
imprimir\'a con el comando {\tt lp}.

En lugar de teclear todos esos comandos, podr\'{\i}a agruparlos en un 
{\bf gui\'on del int\'erprete de comandos}. Describimos los guiones 
brevemente en la Secci\'on~\ref{sec-shell-script}. El gui\'on usado para 
ejecutar todas las \'ordenes ser\'{\i}a
\begin{tscreen}\begin{verbatim}
#!/bin/sh
# A shell script to create and print the book

cat chapter1 chapter2 chapter3 > book
wc -l book
lp book
\end{verbatim}\end{tscreen}

Si el gui\'on se salva en el fichero {\tt makebook}, podr\'{\i}a simplemente 
usar la orden
\begin{tscreen}
/home/larry\# {\em makebook}
\end{tscreen}
para ejecutar todas las \'ordenes del gui\'on. Los guiones son simples 
ficheros de texto; puede crearlos con un editor como {\tt emacs} o {\tt vi}
% \ifodd\igsascii {} \else
\footnote{{\tt vi} se describe en la Secci\'on~\ref{sec-vi}.}.
% \fi

Veamos este gui\'on. La primera l\'{\i}nea ``{\tt \#!/bin/sh}'', 
identifica el fichero como un gui\'on y le dice al int\'erprete de 
comandos como ejecutarlo. Instruye al int\'erprete a pasarle el gui\'on 
a {\tt /bin/sh} para la ejecuci\'on, donde {\tt /bin/sh} es el programa 
del int\'erprete. ?`Por qu\'e es esto importante? En la mayor\'{\i}a de los 
sistemas UNIX {\tt /bin/sh} es un int\'erprete de comandos Bourne, como 
Bash. Forzando al gui\'on a ejecutarse usando {\tt /bin/sh} nos estamos 
asegurando de que ser\'a interpretado seg\'un la sintaxis de Bourne. Esto 
har\'a que el gui\'on se ejecute usando la sintaxis Bourne aunque est\'e 
usando Tcsh como int\'erprete de comandos.

\index{guiones del int\'erprete de comandos!comentarios}
La segunda l\'{\i}nea es un {\em comentario}. Estos comienzan con el 
car\'acter ``{\tt \#}'' y continuan hasta el final de la l\'{\i}nea. Los 
comentarios son ignorados por el int\'erprete de comandos---son 
habitualmente usados para identificar el gui\'on con el programador.

El resto de las l\'{\i}neas del gui\'on son simplemente \'ordenes como las 
que podr\'{\i}a teclear directamente. En efecto, el int\'erprete de 
comandos lee cada l\'{\i}nea del gui\'on y ejecuta la l\'{\i}nea como si 
hubiese sido tecleada en la l\'{\i}nea de comandos.

\index{guiones del int\'erprete de comandos!permisos para}
\index{permisos!para los guiones del int\'erprete de comandos}
Los permisos son importantes para los guiones. Si crea un gui\'on, debe
asegurarse de que tiene permisos de ejecuci\'on para poder
ejecutarlo\footnote{Cuando crea ficheros de texto, los permisos por defecto
usualmente no incluyen los de ejecuci\'on.}.
La orden
\begin{tscreen}
/home/larry\# {\em chmod u+x makebook}
\end{tscreen}
puede ser usada para dar permisos de ejecuci\'on al gui\'on {\tt makebook}.

\subsection{Variables del int\'erprete de comandos y el entorno}
\index{int\'erprete de comandos!variables!defined}
\index{variables!int\'erprete de comandos}
\index{variables!en guiones}
\index{guiones del int\'erprete de comandos!variables en}
El int\'erprete de comandos le permite definir {\bf variables} como la 
mayor\'{\i}a de los lenguajes de programaci\'on. Una variable es simplemente 
un trozo de datos al que se le da un nombre.

\blackdiamond Notese que Tcsh, as\'{\i} como otros int\'erpretes del estilo C, usan
un mecanismo diferente para inicializar variables del descrito aqu\'{\i}. Esta
discusi\'on supondr\'a el uso del int\'erprete Bourne, como es Bash (el cual
probablemente est\'a usando). Vea la p\'agina de manual de Tcsh para m\'as
detalles.

Cuando asigna un valor a una variable (usando el operador ``{\tt =}''),
puede acceder a la variable a\~nadiendo a su nombre ``{\tt \$}'', como se 
ve a continuaci\'on.
\begin{tscreen}
/home/larry\# {\em foo=``hello there''} 
\end{tscreen}
A la variable {\tt foo} se le da el valor ``{\tt hello there}''. Podemos
ahora hacer referencia a ese valor a trav\'es del nombre de la variable con el
prefijo ``{\tt \$}''. La orden
\begin{tscreen}
/home/larry\# {\em echo \$foo} \\
hello there \\
/home/larry\# 
\end{tscreen}
produce el mismo resultado que
\begin{tscreen}
/home/larry\# {\em echo ``hello there''} \\
hello there \\
/home/larry\# 
\end{tscreen}

Estas variables son internas al int\'erprete. Esto significa que solo \'este
podr\'a acceder a las variables. Esto puede ser \'util en los guiones; si
necesita mantener, por ejemplo, el nombre de un fichero, puede almacenarlo
en una variable. Usando la orden {\tt set} mostrar\'a una lista de todas las
variables definidas en el int\'erprete de comandos.

\index{variables del int\'erprete de comandos!exportando al entorno}
\index{exportar@{\tt exportar}}
De cualquier modo, el int\'erprete de comandos permite {\bf exportar} 
variables al {\bf entorno}. El entorno es el conjunto de variables a las 
cuales tienen acceso todas las \'ordenes que ejecute. Una vez que se 
define una variable en el int\'erprete, exportarla hace que se convierta 
tambi\'en en parte del entorno. La orden {\tt export} es usada para 
exportar variables al entorno.

\index{setenv@{\tt setenv}}
\blackdiamond De nuevo, hemos de diferenciar entre Bash y Tcsh. Si est\'a
usando Tcsh, deber\'a usar una sintaxis diferente para las variables de
entorno (se usa la orden {\tt setenv}). Dir\'{\i}jase a la p\'agina de 
manual de Tcsh para m\'as informaci\'on.

\index{variables!entorno}
El entorno es muy importante en un sistema UNIX. Le permite configurar
ciertas \'ordenes simplemente inicializando variables con las \'ordenes ya
conocidas.

Veamos un ejemplo r\'apido. La variable de entorno {\tt PAGER} es usada por la
orden {\tt man}. Especifica la orden que se usar\'a para mostrar las p\'aginas
del manual una a una. Si inicializa {\tt PAGER} con el nombre del
programa, se usar\'a este para mostrar las p\'aginas de manual en lugar de 
{\tt more} (el cual es usado por defecto).

Inicialice {\tt PAGER} a ``{\tt cat}''. Esto har\'a que la salida de 
{\tt man} sea mostrada de una, sin pausas entre p\'aginas.
\begin{tscreen}
/home/larry\# {\em PAGER=``cat''}
\end{tscreen}

Ahora exportamos {\tt PAGER} al entorno.
\begin{tscreen}
/home/larry\# {\em export PAGER}
\end{tscreen}

Puebe la orden {\tt man ls}. La p\'agina deber\'{\i}a volar por su 
pantalla sin detenerse entre p\'aginas.

Ahora, si inicializa {\tt PAGER} a ``{\tt more}'', se usar\'a la orden 
{\tt more} para mostrar las p\'aginas del manual.
\begin{tscreen}
/home/larry\# {\em PAGER=``more''}
\end{tscreen}

N\'otese que no hemos de usar la orden {\tt export} despu\'es del cambio 
de la variable {\tt PAGER}. Solo hemos de exportar las variables una vez; 
cuaquier cambio efectuado con posterioridad ser\'a autom\'aticamente 
propagado al entorno.

Las p\'aginas de manual para una orden en particular, le informar\'an acerca del
uso de alguna variable de entorno por parte de esa orden; por ejemplo, la
p\'agina de manual de {\tt man} explica que {\tt PAGER} es usado para
especificar la orden de paginado.

Algunas \'ordenes comparten variables de entorno; por ejemplo, muchas \'ordenes
usan la variable {\tt EDITOR} para especificar el editor por defecto para
usar si es necesario.

El entorno es tambi\'en usado para guardar informaci\'on importante acerca de
la sesi\'on en curso. Un ejemplo es la variable de entorno {\tt HOME}, que
contiene el nombre del directorio de origen del usuario.
\begin{tscreen}
/home/larry/papers\# {\em echo \$HOME} \\
/home/larry
\end{tscreen}

Otra variable de entorno interesante es {\tt PS1}, la cual define el
``prompt'' principal que usar\'a el int\'erprete. Por ejemplo,
\begin{tscreen}
/home/larry\# {\em PS1=``Your command, please: ''} \\
Your command, please: 
\end{tscreen}

Para volver a inicializar el ``prompt'' a su valor habitual (el cual
contiene el directorio actual seguido por el s\'{\i}mbolo ``{\tt \#}''),
\begin{tscreen}
Your command, please: {\em PS1=``\verb-\w# -''} \\
/home/larry\# 
\end{tscreen}
La p\'agina de manual de {\tt bash} describe la sintaxis usada para
inicializar el ``prompt''.

\subsubsection{La variable de entorno {\tt PATH}}
\index{entorno!variables!PATH@{\tt PATH}}

Cuando usa la orden {\tt ls} ?`c\'omo encuentra el int\'erprete el programa
ejecutable {\tt ls}?. De hecho, {\tt ls} se encuentra en {\tt /bin/ls} en la
mayor\'{\i}a de los sistemas. El int\'erprete usa la variable de entorno 
{\tt PATH} para localizar los ficheros ejecutables u \'ordenes que tecleamos.

Por ejemplo, su variable {\tt PATH} puede inicializarse a:
\begin{tscreen}
/bin:/usr/bin:/usr/local/bin:.
\end{tscreen}

Esto es una lista de directorios en los que el int\'erprere debe buscar. Cada
directorio est\'a separado por un ``{\tt :}''. Cuando usa la orden {\tt ls},
el int\'erprete primero busca {\tt /bin/ls}, luego {\tt /usr/bin/ls} y 
as\'{\i} hasta que lo localice o acabe la lista.

N\'otese que {\tt PATH} no interviene en la localizaci\'on de ficheros
regulares. Por ejemplo, si usa la orden
\begin{tscreen}
/home/larry\# {\em cp foo bar}
\end{tscreen}
El int\'erprete no usar\'a {\tt PATH} para localizar los ficheros {\tt foo} y
{\tt bar}---esos nombres se suponen completos. Solo se usar\'a {\tt PATH} para
localizar el programa ejecutable {\tt cp}.

Esto le permitir\'a ahorrar mucho tiempo; significa que no deber\'a recordar
donde son guardadas las \'ordenes. En muchos sistemas los ficheros 
ejecutables se dispersan por muchos sitios, como {\tt /usr/bin}, {\tt 
/bin} o {\tt /usr/local/bin}. En lugar de dar el nombre completo con el 
camino (como {\tt /usr/bin/cp}), solo hemos de inicializar {\tt PATH} con 
la lista de los directorios donde queremos que se busquen autom\'aticamente.

N\'otese que {\tt PATH} contiene ``{\tt .}'', el cual es el directorio 
actual de trabajo. Esto le permite crear guiones o programas y 
ejecutarlos desde su directorio de trabajo actual sin tener que 
especificarlo directamente (como en {\tt ./makebool}). Si un directorio 
no est\'a en su {\tt PATH}, entonces el int\'erprete no buscar\'a en \'el 
ordenes para ejecutar---esto incluye al directorio de trabajo.

\subsection{Guiones de inicializaci\'on del int\'erprete}\label{sec-init-scripts}
\index{guiones del int\'erprete de comandos!inicializacion}
\index{guiones de inicializaci\'on!para int\'erpretes de comandos}

A parte de los guiones que puede crear, hay un n\'umero de estos que usa el
int\'erprete de comandos para ciertos prop\'ositos. Los m\'as importantes 
son sus {\bf guiones de inicializaci\'on}, guiones autom\'aticamente 
ejecutados por el int\'erprete al abrir una sesi\'on.

Los guiones de inicializaci\'on son eso, simples guiones como los descritos
arriba. De cualquier modo, son muy \'utiles para la inicializaci\'on de su
entorno al ejecutarse autom\'aticamente. Por ejemplo, si siempre usa la orden
{\tt mail} para comprobar si tiene correo al iniciar una sesi\'on, incluya en
su gui\'on de inicializaci\'on dicha orden y ser\'a ejecutada autom\'aticamente.

\index{Int\'erprete de presentaci\'on!defined}
Tanto Bash como Tcsh distinguen entre un {\bf int\'erprete de presentaci\'on} y
otras invocaciones del int\'erprete. Un int\'erprete de presentaci\'on es 
el que se ejecuta en el momento de la presentaci\'on al sistema (login). 
Es el \'unico que usar\'a. De cualquier modo, si ejecuta una opci\'on de 
salir a un int\'erprete desde alg\'un programa, como {\tt vi}, inicializa 
otra instancia del int\'erprete de comandos, el cual no es su 
int\'erprete de presentaci\'on. Adem\'as, en cualquier momento que 
ejecuta un gui\'on, autom\'aticamente est\'a arrancando otro int\'erprete 
que va a ser el encargado de ejecutar el gui\'on.

\index{int\'erpretes de comandos!ficheros de inicializaci\'on}
\index{ficheros de inicializaci\'on!para int\'erpretes de comandos}
\index{/etc/profile@{\tt /etc/profile}}
\index{.bash\_profile@{\tt .bash\_profile}}
\index{.bashrc@{\tt .bashrc}}
\index{.profile@{\tt .profile}}
Los ficheros de inicializaci\'on usados por Bash son: {\tt /etc/profile}
(configurado por el administrador del sistema, y ejecutado por todos los
usuarios de Bash en el momento de la presentaci\'on al sistema), 
{\tt \$HOME/.bash\_profile} (ejecutado por una sesi\'on de presentaci\'on Bash)
y {\tt \$HOME/.bashrc} (ejecutadas por todas las sesiones Bash que no son de
presentaci\'on). Si {\tt .bash\_profile} no est\'a presente, se usa en su lugar 
{\tt .profile}

\index{/etc/csh.login@{\tt csh.login}}
\index{.tcshrc@{\tt.tcshrc}}
Tcsh usa los siguientes guiones de inicializaci\'on: {\tt /etc/csh.login}
(ejecutado por todos los usuarios de Tcsh en el momento de la presentaci\'on
al sistema), {\tt \$HOME/.tcshrc} (ejecutado en la presentaci\'on al sistema
por todas las instancias nuevas de Tcsh) y {\tt \$HOME/.login} (ejecutado en
la presentaci\'on al sistema, seguido {\tt .tcshrc}).
Si {\tt .tcshrc} no est\'a presente, {\tt .cshrc} se usa en su lugar.

Para entender completamente la funci\'on de estos ficheros, necesitar\'a
aprender m\'as acerca del int\'erprete de comandos. La programaci\'on de 
guiones es una materia complicada, m\'as all\'a del alcance de este 
libro. Lea las p\'aginas de manual de {\tt bash} y/o {\tt tcsh} para 
aprender m\'as sobre la configuraci\'on de su entorno.

\index{entorno!personalizaci\'on|)}
