Aprendiendo_Korn_Shell/Secciones/ApendiceB.tex

814 lines
53 KiB
TeX

Este apéndice contiene listas de referencia para opciones de invocación, comandos incorporados y palabras clave, alias predefinidos, variables de shell incorporadas, operadores de \emph{prueba}, opciones de shell, opciones de \emph{typeset}, aritmética, comandos en modo \emph{emacs} y comandos de control en modo \emph{vi}. Además, describe cómo utilizar todas las facilidades del comando incorporado \emph{getopts}.
\section{Opciones de invocación}
Esta es una lista de las opciones que puede usar cuando invoque al shell de Korn. Además de éstas, se puede utilizar cualquier opción establecida en la línea de órdenes; consulte la tabla de opciones más adelante en este apéndice. Los intérpretes de comandos de inicio de sesión suelen invocarse con las opciones \texttt{-i} (interactivo), \texttt{-s} (leer de la entrada estándar) y \texttt{-m} (habilitar el control de trabajos).
\begin{table}[h]
\center
\begin{tabular}{|m{2cm}|m{13cm}|} \hline
\textbf{Opción} & \textbf{Significado} \\ \hline
-c \emph{string} & Ejecuta \emph{string} y después sale \\\hline
-D & Imprime todas las cadenas \texttt{\$"..."} del script. Esto se utiliza para crear una base de datos de traducciones específicas de cada idioma de las cadenas de un script. \\\hline
-i & Shell interactivo. Ignora las señales TERM, INTR y QUIT. \\\hline
-r & Shell restringido. Ver \hyperref[sec:Chapter10]{Capítulo 10} \\\hline
-R \emph{filename} & Crea una base de datos de referencias cruzadas para definiciones de variables y comandos en \emph{filename}. No se puede compilar. \\\hline
-s & Leer comandos de la entrada estándar. Si se proporciona un argumento, esta bandera tiene prioridad (es decir, el argumento no se tratará como un nombre de script y se leerá la entrada estándar). \\\hline
\end{tabular}
\end{table}
\section{Comandos integrados y palabras clave}
He aquí un resumen de todos los comandos y palabras clave incorporados.
\begin{longtable}[h]{|p{2cm}|p{3.5cm}|p{2cm}|p{7.5cm}|} \hline
\textbf{Nombre} & \small{\textbf{Comando / Palabra Clave}} & \textbf{Capítulo} & \textbf{Resumen} \\\hline
\endfirsthead
\hline
\textbf{Nombre} & \small{\textbf{Comando / Palabra Clave}} & \textbf{Capítulo} & \textbf{Resumen} \\\hline
\endhead
! & Palabra clave & 5 & Invierte el resultado verdadero/falso de la siguiente tubería. \\\hline
: & Comando & 7 & No hacer nada (sólo hacer expansiones de argumentos). \\\hline
. & Comando & 4 & Leer archivo y ejecutar su contenido en el shell actual. \\\hline
alias & Comando & 3 & Establecer la abreviatura de comando o línea de comandos. \\\hline
bg & Comando & 8 & Poner trabajo en segundo plano. \\\hline
builtin & Comando & & Añade o elimina comandos incorporados; imprime información sobre ellos. \\\hline
break & Comando & 5 & Salir del bucle \texttt{for, select, while} o \texttt{until} circundante. \\\hline
case & Comando & 5 & Construcción condicional multidireccional. \\\hline
cd & Comando & 1 & Cambiar el directorio de trabajo. \\\hline
command & Comando & 5 & Localizar comandos integrados y externos; encontrar un comando integrado en lugar de una función con el mismo nombre. \\\hline
continue & Comando & 4 & Salta a la siguiente iteración del bucle \texttt{for, select, while} o \texttt{until}. \\\hline
disown & Comando & 8 & Desasociar un trabajo en segundo plano del shell actual. El efecto es que el trabajo no recibe la señal HUP cuando el shell sale. \\\hline
echo & Comando & 4 & Expandir e imprimir argumentos (obsoleto). \\\hline
exec & Comando & 9 & Sustituye el shell por el programa dado. \\\hline
exit & Comando & 5 & Salida del shell. \\\hline
export & Comando & 3 & Crear variables de entorno. \\\hline
eval & Comando & 7 & Procesa los argumentos como una línea de comandos. \\\hline
false & Comando & 8 & No hacer nada y salir sin éxito. Útil para hacer bucles infinitos. \\\hline
fg & Comando & 8 & Poner el trabajo de fondo en primer plano. \\\hline
for & Palabra clave & 5 & Construcción en bucle. \\\hline
function & Palabra clave & 4 & Definir función \\\hline
getconf & Comando & & Obtener información específica del sistema. Los parámetros están definidos por POSIX. \\\hline
getopts & Comando & 6 & Opciones de la línea de comandos del proceso. \\\hline
hist & Palabra clave & 2 & Trabajar con el historial de comandos. \\\hline
if & Comando & 1 & Construcción condicional. \\\hline
jobs & Comando & 1 & Enumera los trabajos de fondo. \\\hline
kill & Comando & 8 & Enviar señal al proceso. \\\hline
let & Comando & 6 & Asignación aritmética de variables. \\\hline
newgrp & Comando & & Iniciar nuevo shell con nuevo ID de grupo (obsoleto). \\\hline
print & Comando & 1 & Expande e imprime los argumentos en la salida estándar. \\\hline
printf & Comando & 7 & Expande e imprime los argumentos en la salida estándar, utilizando los especificadores de formato \emph{printf(3)} de ANSI C. \\\hline
pwd & Comando & 1 & Imprimir directorio de trabajo. \\\hline
read & Comando & 7 & Leer una línea de la entrada estándar. \\\hline
readonly & Comando & 5 & Hacer que las variables sean de sólo lectura (no asignables). \\\hline
return & Comando & 5 & Retorno desde función o script circundante. \\\hline
select & Palabra clave & 5 & Constructo de generación de menús. \\\hline
set & Comando & 3 & Configura las opciones. \\\hline
shift & Comando & 6 & Cambia los argumentos de la línea de comandos. \\\hline
sleep & Comando & 8 & Suspende la ejecución durante el número de segundos indicado. \\\hline
test & Comando & 5 & Versión antigua del programa de prueba condicional. Utilice \texttt{[[...]]} en su lugar. \\\hline
time & Palabra clave & & Ejecuta el comando e imprime los tiempos de ejecución. Por sí mismo, imprime los tiempos acumulados para el shell y todos los hijos. \\\hline
trap & Comando & 8 & Establezca una rutina de captación de señales. \\\hline
true & Comando & 8 & No hacer nada y salir con éxito. Útil para hacer bucles infinitos. \\\hline
typeset & Comando & 6 & Establecer características especiales de variables y funciones. \\\hline
ulimit & Comando & 10 & Establecer/mostrar los límites de recursos del proceso. \\\hline
umask & Comando & 10 & Establecer/mostrar máscara de permisos de archivo. \\\hline
unalias & Comando & 3 & Eliminar definiciones de alias. \\\hline
unset & Comando & 3 & Eliminar definiciones de variables o funciones. \\\hline
until & Palabra clave & 5 & Construcción en bucle. \\\hline
wait & Comando & 8 & Espere a que termine(n) la(s) tarea(s) en segundo plano. \\\hline
whence & Comando & 3 & Identificar la fuente de mando. \\\hline
while & Palabra clave & 5 & Construcción en bucle. \\\hline
\end{longtable}
Las asignaciones para los comandos \emph{alias, export, readonly} y \emph{typeset} se procesan como asignaciones de variables, en el sentido de que la expansión de tilde se realiza después del carácter =, y la división de campos no se realiza en ninguna sustitución de variable en el valor que se asigna.
\section{Alias predefinidos}
Hay una serie de alias predefinidos, es decir, incorporados automáticamente a \emph{ksh} en tiempo de compilación. Están listados en la siguiente tabla. Tenga en cuenta que algunos de ellos se definen con un carácter de espacio al final. Esto permite la expansión del alias en la palabra que sigue al alias en la línea de comandos.
\begin{table}[h]
\center
\begin{tabular}{|m{2cm}|m{2cm}|m{11cm}|} \hline
\textbf{Nombre} & \textbf{Capítulo} & \textbf{Valor completo} \\ \hline
autoload & 4, 6 & \texttt{alias autoload='typeset -fu'} \\\hline
command & 7 & \texttt{alias command='command '} \\\hline
fc & 2 & \texttt{alias fc=hist} \\\hline
float & 6 & \texttt{alias float='typeset -E'} \\\hline
functions & 6 & \texttt{alias functions='typeset -f'} \\\hline
hash & 3 & \texttt{alias hash='alias -t --'} \\\hline
history & 2 & \texttt{alias history='hist -l'} \\\hline
integer & 6 & \texttt{alias integer='typeset -i'} \\\hline
nameref & 4 & \texttt{alias nameref='typeset -n'} \\\hline
nohup & 3,8 & \texttt{alias nohup='nohup '} \\\hline
r & 2 & \texttt{alias r='hist -s'} \\\hline
redirect & 9 & \texttt{alias redirect='command exec'} \\\hline
stop & 8 & \texttt{alias stop='kill -s STOP'} \\\hline
times & & \texttt{alias time='\{ \{time;\} 2>\&1;\}'} \\\hline
type & 4 & \texttt{alias type='whence -v'} \\\hline
\end{tabular}
\end{table}
\section{Variables de Shell incorporadas}
He aquí un resumen de todas las variables de shell incorporadas:
\begin{longtable}[h]{|p{3cm}|p{2cm}|p{10cm}|} \hline
\textbf{Variable} & \textbf{Capítulo} & \textbf{Significado}\\ \hline
\endfirsthead
\hline
\textbf{Variable} & \textbf{Capítulo} & \textbf{Significado}\\ \hline
\endhead
\# & 4 & Número de argumentos dados al proceso actual. \\\hline
0 & 4 & Argumentos de línea de comandos para el proceso actual. Dentro de comillas dobles, se expande a argumentos individuales. \\\hline
* & 4 & Argumentos de línea de comandos para el proceso actual. Dentro de comillas dobles, se expande a un único argumento. \\\hline
- (guión) & & Opciones dadas al shell en la invocación. \\\hline
? & 5 & Estado de salida del comando anterior. \\\hline
\$ & 8 & ID de proceso del proceso shell. \\\hline
\_ (guón bajo) & 3 & Dentro de \texttt{\$MAILPATH:} el nombre de archivo que activó el mensaje <<tienes correo>>. En la línea de comandos: último argumento del comando anterior. Dentro de un script: la ruta completa utilizada para encontrar y ejecutar el script. \\\hline
! & 8 & ID de proceso del último comando en segundo plano. \\\hline
.sh.edchar & 10 & Caracteres introducidos al procesar una trampa KEYBD. \\\hline
.sh.edcol & 10 & Posición del cursor en la trampa KEYBD más reciente. \\\hline
.sh.edmode & 10 & Igual a ESC en modo \emph{vi}, vacío en caso contrario. \\\hline
.sh.edtext & 10 & Caracteres en el búfer de entrada durante una trampa KEYBD. \\\hline
.sh.match & 4 & Variable de matriz con texto que coincide con el patrón en la sustitución de variables. (A partir de \emph{ksh93l}.) \\\hline
.sh.name & 9 & Nombre de una variable que ejecuta una función de disciplina. \\\hline
.sh.subscript & 9 & Subíndice de una variable de matriz que ejecuta una función de disciplina. \\\hline
.sh.value & 9 & Valor de la variable que ejecuta una función de disciplina. \\\hline
.sh.version & 4, 9 & Versión de \emph{ksh}. \\\hline
CDPATH & 3 & Lista de directorios en los que debe buscar el comando \emph{cd}. \\\hline
COLUMNS & 3 & Anchura de visualización en columnas (para los modos de edición y \texttt{select}). \\\hline
EDITOR & 2 & Se utiliza para establecer el modo de edición; también lo utilizan \emph{mail} y otros programas. Anulado por \texttt{VISUAL}, si está configurado. \\\hline
EMPV & 3 & Nombre del archivo que se ejecutará como archivo de entorno cuando se invoque al shell. \\\hline
FCEDIT & 2 & Editor por defecto obsoleto para el comando \emph{hist}. \\\hline
FIGNORE & 1 & Patrón para los archivos a ignorar durante la expansión del patrón. \\\hline
FPATH & 4 & Ruta de búsqueda de funciones autocargadas. \\\hline
HISTCMD & 2 & Número del comando actual en el historial de comandos. \\\hline
HISTEDIT & 2 & Editor por defecto para el comando \emph{hist} \\\hline
HISTFILE & 2 & Nombre del archivo de historial de comandos. \\\hline
HISTSIZE & 2 & Número de líneas guardadas en el archivo histórico. \\\hline
HOME & 3 & Directorio de inicio (login). \\\hline
IFS & 7 & Separador de campo interno: lista de caracteres que actúan como separadores de palabras. Normalmente se establece en espacio, TAB y nueva línea. \\\hline
LANG & & Nombre por defecto de la configuración regional actual; reemplazado por otras variables LC\_*. \\\hline
LC\_ALL & & Nombre de la configuración regional actual; sustituye a LANG y a las demás variables LC\_*. \\\hline
LC\_COLLATE & & Nombre de la configuración regional actual para la clasificación de caracteres. \\\hline
LC\_CTYPE & & Nombre de la configuración regional actual para determinar la clase de caracteres durante la comparación de patrones; véase el \hyperref[sec:Chapter4]{Capítulo 4}. \\\hline
LC\_NUMERIC & & Nombre de la configuración regional actual para el formato de los números (punto decimal, separador de miles). \\\hline
LINEO & 9 & Número de línea del script o función que se acaba de ejecutar. \\\hline
LINES & 3 & Altura de la pantalla en líneas (para el comando \texttt{select}). \\\hline
MAIL & 3 & Nombre del archivo para comprobar si hay correo nuevo. \\\hline
MAILCHECK & 3 & Frecuencia (en segundos) con la que se comprueba si hay correo nuevo. \\\hline
MAILPATH & 3 & Lista de nombres de archivo para comprobar si hay correo nuevo, si MAIL no está configurado. \\\hline
OLDPWD & 3 & Directorio de trabajo anterior. \\\hline
OPTARG & 6 & Argumento de la opción procesada por \emph{getopts}. \\\hline
OPTIND & 6 & Número del primer argumento después de las opciones. \\\hline
PATH & 3 & Ruta de búsqueda de comandos. \\\hline
PPID & 8 & ID del proceso padre. \\\hline
PS1 & 3 & String del símbolo del sistema principal. \\\hline
PS2 & 3 & String de solicitud de continuación de línea. \\\hline
PS3 & 5 & String de consulta para el comando \texttt{select}. \\\hline
PS4 & 9 & String de consulta para la opción \texttt{xtrace}. \\\hline
PWD & 3 & Directorio de trabajo actual. \\\hline
RANDOM & 9 & Número aleatorio entre 0 y 32767 ($2^15-1$). \\\hline
REPLY & 5, 7 & Respuesta del usuario al comando \texttt{select}; resultado del comando \emph{read} si no se dan nombres de variables. \\\hline
SECONDS & 3 & Número de segundos transcurridos desde que se invocó al shell. \\\hline
SHELL & 3 & Ruta completa de los programas shell que se deben utilizar para ejecutar comandos. \\\hline
TMOUT & 5, 7, 10 & Si se establece en un número entero positivo, número de segundos entre comandos tras los cuales el shell termina automáticamente. También se aplica a la lectura de respuestas a \texttt{select} y \emph{read}. \\\hline
VISUAL & 2 & Permite establecer el modo de edición. \\\hline
\end{longtable}
\section{Operadores de prueba}
Son los operadores que se utilizan con la construcción \texttt{[[...]]}. Pueden combinarse lógicamente con \texttt{\&\&} (\texttt{"}y\texttt{"}) y \texttt{||} (\texttt{"}o\texttt{"}) y agruparse con paréntesis. Cuando se utilizan con nombres de archivo de la forma \texttt{/dev/fd/N}, comprueban el atributo correspondiente del descriptor de archivo abierto \emph{N}.
\begin{longtable}{|p{4cm}|p{11cm}|} \hline
\textbf{Operador} & \textbf{Verdadero si} \\ \hline
\endfirsthead
\hline
\textbf{Operador} & \textbf{Verdadero si} \\ \hline
\endhead
-a file & \emph{file} existe (Obsoleto. \texttt{-e} es preferido) \\\hline
-b file & \emph{file} es un dispositivo de bloque \\\hline
-c file & \emph{file} es un dispositivo de caracteres \\\hline
-d file & \emph{file} es un directorio \\\hline
-e file & \emph{file} existe \\\hline
-f file & \emph{file} es un archivo regular \\\hline
-g file & \emph{file} tiene activado el bit de \emph{setgid} \\\hline
-G file & El ID de grupo de \emph{file} es el mismo que el ID de grupo efectivo del intérprete de comandos \\\hline
-h file & \emph{file} es un enlace simbólico \\\hline
-k file & \emph{file} tiene su bit \emph{sticky} activado \\\hline
-l file & \emph{file} es un enlace simbólico. (Solo funciona en sistemas en los que \texttt{/bin/test -l} comprueba si hay enlaces simbólicos \\\hline
-L file & \emph{file} es un enlace simbólico \\\hline
-n string & strin no es nulo \\\hline
-o option & Option está activado \\\hline
-O file & \emph{file} es propiedad del ID de usuario efectivo del intérprete de comandos \\\hline
-p file & \emph{file} es una tubería o una tubería con nombre ( archivo FIFO) \\\hline
-r file & \emph{file} tiene permisos de lectura \\\hline
-s file & \emph{file} no está vacío \\\hline
-S file & \emph{file} es un socket \\\hline
-t file & El descriptor de fichero \emph{N} apunta a una terminal \\\hline
-u file & \emph{file} tiene activado el bit \emph{setuid} \\\hline
-w file & \emph{file} tiene permisos de escritura \\\hline
-x file & \emph{file} tiene permisos de ejecución, o el archivo es un directorio en el que se puede buscar \\\hline
-z string & \emph{string} es nulo \\\hline
fileA -nt fileB & fileA es más reciente que file B, o fileB no existe \\\hline
fileA -ot fileB & fileA es más antiguo que fileB, o fileB no existe \\\hline
fileA -ef fileB & fileA y fileB apuntan al mismo archivo \\\hline
string = pattern & \emph{string} coincide con el patrón (que puede contener comodines). Obsoleto; se prefiere == \\\hline
string == pattern & \emph{String} coincide con el patrón (que puede contener comodines) \\\hline
string != pattern & String no coincide con el patrón \\\hline
stringA < stringB & \emph{StringA} está antes que \emph{StringB} en el orden del diccionario \\\hline
stringA > stringB & \emph{StringA} va después que \emph{StringB} en el orden del diccionario \\\hline
exprA -eq expB & Las expresiones aritméticas \emph{exprA} y \emph{exprB} son iguales \\\hline
exprA -ne exprB & Las expresiones aritméticas \emph{exprA} y \emph{exprB} no son iguales \\\hline
exprA -lt exprB & \emph{exprA} es menor que \emph{exprB} \\\hline
exprA -gt exprB & \emph{exprA} es mayor que \emph{exprB} \\\hline
exprA -le exprB & \emph{exprA} es menor o igual que \emph{exprB} \\\hline
exprA -ge exprB & \emph{exprA} es mayor o igual que \emph{exprB} \\\hline
\end{longtable}
Los operadores \emph{-eq, -ne, -lt, -le, -gt} y \emph{-ge} se consideran obsoletos en \emph{ksh93}; en su lugar debe utilizarse el comando \emph{let} o \texttt{((...))}.
Para =, == y !=, cite el patrón para realizar comparaciones literales de strings.
\section{Opciones}
Son opciones que pueden activarse con el comando \texttt{set -o}. Todas están inicialmente desactivadas excepto donde se indique lo contrario. Las abreviaturas, cuando aparecen, son opciones de set que pueden utilizarse en lugar de la orden \texttt{set -o} completa (por ejemplo, \texttt{set -a} es una abreviatura de \texttt{set -o allexport}). En la mayoría de los casos, las abreviaturas son opciones del shell de Bourne compatibles con versiones anteriores. Para desactivar una opción, utilice \texttt{set +o nombre largo} o \texttt{set +X}, donde \emph{nombre largo} y \emph{X} son la <<forma larga>> o la forma de <<un solo carácter>> de la opción, respectivamente.
\begin{longtable}[h]{|p{2cm}|p{2.5cm}|p{11.5cm}|} \hline
\textbf{Opción} & \small{\textbf{Abreviatura}} & \textbf{Significado} \\ \hline
\endfirsthead
\hline
\textbf{Opción} & \small{\textbf{Abreviatura}} & \textbf{Significado} \\ \hline
\endhead
allexport & -a & Exporta todas las variables definidas posteriormente. \\\hline
bgnice & & Ejecuta todos los trabajos en segundo plano con prioridad reducida (activada por defecto). \\\hline
emacs & & Utilice la edición de línea de comandos estilo Emacs. \\\hline
errexit & -e & Salir del shell cuando un comando sale con un estado distinto de cero. \\\hline
gmacs & & Utiliza la edición de línea de comandos al estilo de Emacs, pero con un significado ligeramente diferente para CTRL-T (véase el capítulo 2). \\\hline
ignoreeof & & No permitir CTRL-D para salir del shell. \\\hline
keyword & -k & Ejecutar asignaciones en medio de líneas de comando. (Muy obsoleto.) \\\hline
markdirs & & Añade \texttt{/} a todos los nombres de directorio generados a partir de la expansión de comodines. \\\hline
monitor & -m & Activar el control de trabajos (activado por defecto). \\\hline
noclobber & -c & No permitir a > la redirección a archivos existentes. \\\hline
noexec & -n & Leer los comandos y comprobar si hay errores de sintaxis, pero no los ejecuta. \\\hline
noglob & -f & Desactivar la expansión de comodines. \\\hline
nolog & & Desactivar el historial de comandos para las definiciones de funciones. \\\hline
notify & -b & Imprime mensajes de finalización de trabajo inmediatamente, en lugar de esperar a la siguiente solicitud. \\\hline
nounset & -u & Tratar las variables indefinidas como errores, no como nulos. \\\hline
pipefail & & Espera a que se completen todos los trabajos de una cadena. El estado de salida es el del último comando que falló, o cero en caso contrario. (\emph{ksh93g} y posteriores). \\\hline
privileged & -p & El script se ejecuta en modo \emph{suid}. \\\hline
trackall & -h & Crea un alias para cada ruta completa encontrada en una búsqueda de comandos. (\emph{ksh93} ignora esta opción; el comportamiento es siempre activado, incluso si esta opción está desactivada). \\\hline
verbose & -v & Imprime los comandos (textualmente) antes de ejecutarlos. \\\hline
vi & & Utilice la edición de línea de comandos estilo \emph{vi}. \\\hline
viraw & & Utilice el modo \emph{vi} y haga que cada pulsación de tecla tenga efecto inmediatamente. (Esto es necesario en algunos sistemas muy antiguos para que el modo \emph{vi} funcione, y es necesario en todos los sistemas para poder usar TAB para completar. A partir de \emph{ksh93n}, se habilita automáticamente cuando se usa \emph{vi-mode}). \\\hline
xtrace & -x & Imprime los comandos (después de las expansiones) antes de ejecutarlos. \\\hline
\end{longtable}
El comando set tiene algunas opciones adicionales que no tienen sus correspondientes versiones set -o, como se indica a continuación:
\begin{table}[h]
\center
\begin{tabular}{|m{2cm}|m{13cm}|} \hline
\textbf{Opción} & \textbf{Significado} \\ \hline
set -A ... & Asignación de matrices indexadas. \\\hline
set -s & Ordena los parámetros posicionales. \\\hline
set -t & Leer y ejecutar un comando, y luego salir. (Obsoleto.) \\\hline
\end{tabular}
\end{table}
\section{Opciones tipográficas}
Estas son las opciones del comando \emph{typeset}. Utilice \texttt{+option} para desactivar una opción, por ejemplo, \texttt{typeset +x foo} para dejar de exportar la variable foo.
\begin{longtable}[h]{|p{2.5cm}|p{12.5cm}|} \hline
\textbf{Opción} & \textbf{Significado} \\ \hline
\endfirsthead
\hline
\textbf{Opción} & \textbf{Significado} \\ \hline
\endhead
& Sin opción, crear variable local dentro de la función. \\\hline
-A & Declarar variable como array asociativo. \\\hline
-E[\emph{n}] & Declara la variable como un número de punto flotante. Opcional \emph{n} es el número de cifras significativas. \\\hline
-F[\emph{n}] & Declara la variable como un número de punto flotante. Opcional \emph{n} es el número de dígitos significativos. \\\hline
-f & Sin argumentos, imprime todas las definiciones de funciones. \\\hline
-f \emph{fname} & Imprime la definición de la función \emph{fname}. \\\hline
+f & Imprime todos los nombres de las funciones. \\\hline
-ft & Activar el modo de rastreo para la(s) función(es) nombrada(s). \\\hline
+ft & Desactiva el modo de rastreo para la(s) función(es) nombrada(s). \\\hline
-fu & Definir nombre(s) dado(s) como función(es) \emph{autoloaded}. \\\hline
-fx & Obsoleto; no hace nada en \emph{ksh93}. \\\hline
-H & Asignación de nombres de archivo de Unix a host para sistemas no Unix. \\\hline
-i[\emph{n}] & Declara la variable como un entero. Opcional \emph{n} es la base de salida. \\\hline
-l & Convierte todas las letras a minúsculas. \\\hline
-L & Justificar a la izquierda y eliminar los espacios a la izquierda. \\\hline
-n & Declarar variable como \emph{nameref}. \\\hline
-p & Imprime comandos \emph{tipográficos} (\emph{typeset}) para volver a crear variables con los mismos atributos. \\\hline
-r & Hacer que la variable sea de sólo lectura. \\\hline
-R & Justificar a la derecha y eliminar los espacios finales. \\\hline
-t & Etiquetar la variable. (Obsoleto.) \\\hline
-u & Convierte todas las letras a mayúsculas. \\\hline
-ui[\emph{n}] & Declara la variable como un entero sin signo. Opcional \emph{n} es la base de salida. (\emph{ksh93m} y posteriores). \\\hline
-x & Variable de exportación, es decir, poner en el entorno para que se pase a los subprocesos. \\\hline
-Z[\emph{n}] & Justificar a la derecha y rellenar con ceros a la izquierda. \emph{n} es la anchura, o la anchura se establece a partir del valor utilizado en la primera asignación. \\\hline
\end{longtable}
\section{Aritmética}
A partir de \emph{ksh93m}, la instalación de aritmética incorporada comprende un gran porcentaje de las expresiones del lenguaje C. Esto hace que el shell sea más atractivo como un lenguaje de programación completo. Las siguientes características están disponibles:
\emph{Sufijos de tipo al final}\\
Las constantes enteras pueden tener un sufijo \texttt{U} o \texttt{L} al final para indicar que son sin signo o largas, respectivamente. Aunque las versiones en minúsculas también se pueden usar, esto no se recomienda, ya que es fácil confundir una \texttt{l} (ele minúscula) con un 1 (uno).
\emph{Constantes de caracteres en C} \\
Se reconocen las constantes de caracteres individuales en C, entre comillas simples. Al igual que en C, actúan como constantes enteras. Por ejemplo:
\begin{lstlisting}[language=bash]
$ typeset -i c
$ for ((c = 'a'; c <= 'z'; c++))
> do print $c
> done
97
98
99
100
...
\end{lstlisting}
\emph{Constantes octales y hexadecimales} \\
Puedes utilizar el formato C para constantes octales (base 8) y hexadecimales (base 16). Las constantes octales comienzan con un 0 líder, y las constantes hexadecimales comienzan con un \texttt{0x} o \texttt{0X} líder. Por ejemplo:
\begin{lstlisting}[language=bash]
$ print $((010 + 1)) # Octal 10 es decimal 8
9
$ print $((0x10 + 1)) # Hexadecimal 10 es decimal 16
17
\end{lstlisting}
\emph{Aritmética con enteros sin signo} \\
Al usar \texttt{typeset -ui}, puedes crear enteros sin signo. Los enteros regulares representan números positivos y negativos. Los enteros sin signo comienzan en 0, llegan hasta algún valor dependiente de la implementación y luego <<se envuelven>> nuevamente a 0. Del mismo modo, restar 1 de 0 se envuelve en la otra dirección, dando como resultado el número sin signo más grande:
\begin{lstlisting}[language=bash]
$ typeset -ui u=0
$ let u--
$ print $u
4294967295
\end{lstlisting}
\emph{Operadores y precedencia en C} \\
\emph{ksh} admite el conjunto completo de operadores en C, con la misma precedencia y asociatividad. Los operadores se presentaron en detalle en el \hyperref[sec:Chapter6]{Capítulo 6} y se resumen nuevamente a continuación.
\begin{longtable}[h]{|p{5cm}|p{6cm}|p{4cm}|} \hline
\textbf{Operador} & \textbf{Significado} & \textbf{Asociatividad} \\\hline
\endfirsthead
\hline
\textbf{Operador} & \textbf{Significado} & \textbf{Asociatividad} \\\hline
\endhead
\texttt{++ --} & Incremento y decremento, prefijo y postfijo & De izquierda a derecha \\\hline
\texttt{+ - ! \~{}} & Más y menos unarios; negación lógica y por bits & De derecha a izquierda \\\hline
\texttt{**} & Exponenciación \tablefootnote{\emph{ksh93m} y versiones más recientes. El operador ** no está en el lenguaje C.} & De derecha a izquierda \\\hline
\texttt{* ? / \%} & Multiplicación, división y resta & De izquierda a derecha \\\hline
\texttt{+ -} & Suma y resta & De izquierda a derecha \\\hline
\texttt{<< >>} & Desplazamiento de bits a izquierda y derecha & De izquierda a derecha \\\hline
\texttt{< <= > >=} & Comparaciones & De izquierda a derecha \\\hline
\texttt{== !=} & Iguales y no iguales & De izquierda a derecha \\\hline
\texttt{\&} & Bit a bit <<y>> & De izquierda a derecha \\\hline
\texttt{\^{}} & <<O>> exclusivo bit a bit & de Izquierda a derecha \\\hline
\texttt{|} & Bit a bit <<o>> & De izquierda a derecha \\\hline
\texttt{\&\&} & AND lógico & De izquierda a derecha \\\hline
\texttt{||} & OR lógico & De izquierda a derecha \\\hline
\texttt{?:} & Expresión condicional & De derecha a izquierda \\\hline
\texttt{= += -= *= /= \%= \&= \^{}= <<= >>=} & Operadores de asignación & De derecha a izquierda \\\hline
\texttt{,} & Evaluación secuencial & De izquierda a derecha \\\hline
\end{longtable}
\section{Comandos del modo Emacs}
Aquí tienes una lista completa de todos los comandos del modo de edición de \emph{emacs}. Algunos de estos, como \texttt{ESC [ A,} representan secuencias de teclas de flecha de terminal estándar ANSI; se agregaron para \emph{ksh93h}.
\begin{longtable}[h]{|p{3cm}|p{12cm}|} \hline
\textbf{Comando} & \textbf{Significado} \\\hline
\endfirsthead
\hline
\textbf{Comando} & \textbf{Significado} \\\hline
\endhead
CTRL-A & Mover al principio de la línea \\\hline
CTRL-B & Retroceder un carácter sin borrar \\\hline
CTRL-C & Capitalizar el carácter después del punto \\\hline
CTRL-D & Borrar un carácter hacia adelante \\\hline
CTRL-E & Mover al final de la línea \\\hline
CTRL-F & Avanzar un carácter \\\hline
CTRL-I (TAB) & Completar el nombre de archivo en la palabra actual (a partir de \emph{ksh93h}) \\\hline
CTRL-J & Igual que ENTER. \\\hline
CTRL-K & Borrar (<<kill>>) hacia adelante hasta el final de la línea \\\hline
CTRL-L & Limpiar pantalla \\\hline
CTRL-M & Igual que ENTER \\\hline
CTRL-N & Línea siguiente \\\hline
CTRL-O & Igual que ENTER, luego muestra la línea siguiente en el archivo de historial \\\hline
CTRL-P & Línea anterior \\\hline
CTRL-R & Buscar hacia atrás \\\hline
CTRL-T & Intercambiar los dos caracteres a cada lado del punto \\\hline
CTRL-U & Repetir el siguiente comando cuatro veces \\\hline
CTRL-V & Imprimir la versión del shell de Korn \\\hline
CTRL-W & Borrar (<<wipe>>) todos los caracteres entre el punto y la marca \\\hline
CTRL-X CTRL-E & Invocar el programa \emph{emacs} en el comando actual \\\hline
CTRL-X CTRL-X & Intercambiar el punto y la marca \\\hline
CTRL-Y & Recuperar (<<yank>>) el último elemento eliminado \\\hline
CTRL-] x & Buscar hacia adelante x, donde x es cualquier carácter \\\hline
CTRL-@ & Establecer la marca en el punto \\\hline
DEL & Borrar un carácter hacia atrás \\\hline
CTRL-[ & Igual que ESC (en la mayoría de los teclados) \\\hline
ESC b & Mover una palabra hacia atrás \\\hline
ESC c & Cambiar la palabra después del punto a mayúsculas \\\hline
ESC d & Borrar una palabra hacia adelante \\\hline
ESC f & Mover una palabra hacia adelante \\\hline
ESC h & Borrar una palabra hacia atrás \\\hline
ESC l & Cambiar la palabra después del punto a minúsculas \\\hline
ESC p & Guardar caracteres entre el punto y la marca como si estuvieran borrados \\\hline
ESC CTRL-H & Borrar una palabra hacia atrás \\\hline
ESC CTRL-] x & Buscar hacia atrás x, donde x es cualquier carácter \\\hline
ESC ESPACIO & Establecer la marca en el punto \\\hline
ESC \# & Insertar línea en el archivo de historial para edición futura \\\hline
ESC DEL & Borrar una palabra hacia atrás \\\hline
ESC < & Mover al principio del archivo de historial \\\hline
ESC > & Mover al final del archivo de historial \\\hline
ESC . & Insertar última palabra en la línea de comando anterior después del punto \\\hline
ESC \_ & Igual que arriba \\\hline
ESC ESC & Hacer la completación de nombre de archivo/comando/variable en la palabra actual \\\hline
ESC * & Hacer la expansión de nombre de archivo/comando/variable en la palabra actual \\\hline
ESC = & Hacer la lista de nombre de archivo/comando/variable en la palabra actual \\\hline
ESC [ A & Línea anterior (\emph{ksh93h} y más reciente) \\\hline
ESC [ B & Línea siguiente (\emph{ksh93h} y más reciente) \\\hline
ESC [ C & Mover un carácter hacia adelante (\emph{ksh93h} y más reciente) \\\hline
ESC [ D & Mover un carácter hacia atrás (sin borrar) (\emph{ksh93h} y más reciente) \\\hline
ESC [ H & Mover al principio de la línea (\emph{ksh93h} y más reciente) \\\hline
ESC [ Y & Mover al final de la línea (\emph{ksh93h} y más reciente) \\\hline
Kill & El carácter de eliminación \emph{stty(1)}, a menudo CTRL-U o @ o CTRL-X. Esto borra todo en la línea. Escribirlo dos veces activa el modo <<line feed>>, que emite un carácter de avance de línea para empezar en una nueva línea. Esto es apropiado para terminales solo de papel. \\\hline
\end{longtable}
\section{Comandos del modo de control vi}
Aquí tienes una lista completa de todos los comandos de control en el modo \emph{vi}. Al igual que con los comandos del modo \emph{emacs}, las secuencias como \texttt{[ A} son para las teclas de flecha estándar ANSI y se agregaron para \emph{ksh93h}.
\begin{longtable}[h]{|p{3cm}|p{12cm}|} \hline
\textbf{Comando} & \textbf{Significado} \\\hline
\endfirsthead
\hline
\textbf{Comando} & \textbf{Significado} \\\hline
\endhead
h & Mover a la izquierda un carácter \\\hline
[ & D Mover a la izquierda un carácter (\emph{ksh93h} y más reciente) \\\hline
l & Mover a la derecha un carácter \\\hline
space & Mover a la derecha un carácter \\\hline
[ C & Mover a la derecha un carácter (\emph{ksh93h} y más reciente) \\\hline
w & Mover a la derecha una palabra \\\hline
b & Mover a la izquierda una palabra \\\hline
W & Mover al principio de la siguiente palabra no en blanco \\\hline
B & Mover al principio de la palabra no en blanco precedente \\\hline
e & Mover al final de la palabra actual \\\hline
E & Mover al final de la palabra actual no en blanco \\\hline
0 & Mover al principio de la línea \\\hline
[ H & Mover al principio de la línea (\emph{ksh93h} y más reciente) \\\hline
\^{} & Mover al primer carácter no en blanco en la línea \\\hline
\$ & Mover al final de la línea \\\hline
[ Y & Mover al final de la línea (\emph{ksh93h} y más reciente) \\\hline
i & Insertar texto antes del carácter actual \\\hline
a & Insertar texto después del carácter actual \\\hline
I & Insertar texto al principio de la línea \\\hline
A & Insertar texto al final de la línea \\\hline
r & Reemplazar un carácter (no entra en modo de entrada) \\\hline
R & Sobrescribir el texto existente \\\hline
dh & Eliminar un carácter hacia atrás \\\hline
dl & Eliminar un carácter hacia adelante \\\hline
db & Eliminar una palabra hacia atrás \\\hline
dw & Eliminar una palabra hacia adelante \\\hline
dB & Eliminar una palabra no en blanco hacia atrás \\\hline
dW & Eliminar una palabra no en blanco hacia adelante \\\hline
d\$ & Eliminar hasta el final de la línea \\\hline
d0 & Eliminar hasta el principio de la línea \\\hline
D & Equivalente a d\$ (eliminar hasta el final de la línea) \\\hline
dd & Equivalente a 0d\$ (eliminar toda la línea) \\\hline
C & Equivalente a c\$ (eliminar hasta el final de la línea, entrar en modo de entrada) \\\hline
cc & Equivalente a 0\$ (eliminar toda la línea, entrar en modo de entrada) \\\hline
s & Equivalente a xi (eliminar el carácter actual, entrar en modo de entrada) \\\hline
S & Equivalente a cc (eliminar toda la línea, entrar en modo de entrada) \\\hline
x & Equivalente a dl (eliminar carácter hacia atrás) \\\hline
X & Equivalente a dh (eliminar carácter hacia adelante) \\\hline
k o - & Mover hacia atrás una línea [ A Mover hacia atrás una línea (\emph{ksh93h} y más reciente) \\\hline
j o + & Mover hacia adelante una línea \\\hline
[ B & Mover hacia adelante una línea (\emph{ksh93h} y más reciente) \\\hline
G & Mover a la línea dada por el recuento de repeticiones \\\hline
/string & Buscar hacia adelante la cadena \\\hline
?string & Buscar hacia atrás la cadena \\\hline
n & Repetir la búsqueda hacia adelante \\\hline
N & Repetir la búsqueda hacia atrás \\\hline
f x & Mover a la siguiente ocurrencia de x hacia la derecha \\\hline
F x & Mover a la ocurrencia anterior de x hacia la izquierda \\\hline
t x & Mover a la siguiente ocurrencia de x hacia la derecha, luego hacia atrás un espacio \\\hline
T x & Mover a la ocurrencia anterior de x hacia la izquierda, luego hacia adelante un espacio \\\hline
yh & Yankar un carácter hacia atrás \\\hline
yl & Yankar un carácter hacia adelante \\\hline
yb & Yankar una palabra hacia atrás \\\hline
yw & Yankar una palabra hacia adelante \\\hline
yB & Yankar una palabra no en blanco hacia atrás \\\hline
yW & Yankar una palabra no en blanco hacia adelante \\\hline
y\$ & Yankar hasta el final de la línea \\\hline
y0 & Yankar hasta el principio de la línea \\\hline
Y & Equivalente a y\$ (yankar hasta el final de la línea) \\\hline
yy & Equivalente a 0y\$ (yankar toda la línea) \\\hline
u & Deshacer el último cambio de edición \\\hline
U & Deshacer todos los cambios de edición realizados en la línea \\\hline
. (punto) & Repetir el último comando de edición \\\hline
| & Mover a la posición absoluta de la columna \\\hline
; & Rehacer el último comando de búsqueda de caracteres \\\hline
, & Rehacer el último comando de búsqueda de caracteres, pero en dirección opuesta \\\hline
\% & Mover a la coincidencia de (, ), \{, \}, [, o ] \\\hline
\textbackslash{} & Realizar la completación de nombre de archivo/comando/variable \\\hline
CTRL-I (TAB) & Realizar la completación de nombre de archivo/comando/variable (solo para \texttt{set -o viraw}) (a partir de \emph{ksh93h}) \\\hline
* & Realizar la expansión de nombre de archivo/comando/variable (en la línea de comandos) \\\hline
= & Realizar la expansión de nombre de archivo/comando/variable (como lista impresa) \\\hline
\~{} & Invertir (<<twiddle>>) mayúsculas y minúsculas del carácter actual \\\hline
\_ & Anexar la última palabra del comando anterior, entrar en modo de entrada \\\hline
v & Ejecutar el comando hist en la línea actual (en realidad, ejecutar el comando \texttt{hist -e \$\{VISUAL:-\$\{EDITOR:-vi\}\}}); generalmente esto significa ejecutar \emph{vi} completo en la línea actual \\\hline
CTRL-J & Igual que ENTER \\\hline
CTRL-L & Iniciar una nueva línea y volver a dibujar la línea actual en ella \\\hline
CTRL-M & Igual que ENTER \\\hline
CTRL-V & Imprimir la versión del shell de Korn \\\hline
\# & Agregar \# (carácter de comentario) a la línea y enviarlo. Si la línea comienza con \#, quitar el \# inicial y todos los \# iniciales después de cualquier salto de línea incrustado \\\hline
@ x & Insertar expansión de alias \_x como entrada de modo de comando \\\hline
\end{longtable}
\section{Uso de \emph{getopts}}
El comando \emph{getopts} es extremadamente capaz. Con él, puedes hacer que tus scripts de shell acepten opciones largas, especificar que los argumentos son opcionales o numéricos, y proporcionar descripciones de los argumentos y valores para que las opciones \texttt{-?, --man, --html} y \texttt{--nroff} funcionen de la misma manera para tu programa que para los comandos internos de \emph{ksh93}.
El precio por este poder es la complejidad del <<lenguaje>> de descripción de opciones. Basándonos en una descripción proporcionada por el Dr. Glenn Fowler de AT\&T Research, describimos cómo evolucionaron las facilidades, cómo funcionan y resumimos cómo usarlas en tus propios programas. Usamos el comando \emph{getopts} extendido en la solución para la \hyperref[box:B-1]{Tarea B-1}.
\begin{mybox}[Tarea B-1]\label{box:B-1}
Diseña el programa \emph{phaser4}, que combina las características de los programas \emph{phaser3} y \emph{tricorder}. Asegúrate de que sea autosuficiente.\footnote{No, las paredes de mi habitación no están cubiertas de pósters de Star Trek. Superé eso hace mucho tiempo, y además, mi esposa no me dejaría de todos modos. ADR.}
\end{mybox}
El primer paso es describir las opciones. Esto se hace con un comentario en la parte superior del script:
\begin{lstlisting}[language=bash]
# uso: phaser4 [ opciones ] archivos
# -k, --kill usar configuración de eliminación (predeterminado)
# -l n, --level n establecer el nivel del phaser (predeterminado = 2)
# -s, --stun usar configuración solo de aturdimiento
# -t [lf], --tricorder [lf] modo tricorder, escaneo opcional para forma de vida lf
\end{lstlisting}
Ahora comienza la diversión. Este esquema de capacidades sigue el orden en que se agregaron funciones a \emph{getopts}.
\begin{enumerate}
\item Comienza con el comando \emph{getopts} como se describe en el \hyperref[sec:Chapter6]{Capítulo 6}. Esto produce una cadena de opciones simple que solo permite opciones de una sola letra:
\begin{lstlisting}[language=bash]
USAGE="kl#st:"
while getopts "$USAGE" optchar ...
\end{lstlisting}
\item Añade una descripción textual para el argumento de opción. Esto se hace encerrando texto arbitrario entre [ y ]:
\begin{lstlisting}[language=bash]
USAGE="kl#[level]st:[life_form]"
while getopts "$USAGE" optchar ...
\end{lstlisting}
\item Permite un valor predeterminado para el argumento de una opción. Esto se hace especificando \texttt{:= value} dentro de la descripción entre corchetes:
\begin{lstlisting}[language=bash]
USAGE="kl#[level:=2]st:[life_form]"
while getopts "$USAGE" optchar ...
\end{lstlisting}
\item Añade ? después de : para indicar un argumento opcional:
\begin{lstlisting}[language=bash]
USAGE="kl#[level:=2]st:?[life_form]"
while getopts "$USAGE" optchar ...
\end{lstlisting}
\item Permite opciones largas que comienzan con \texttt{--}. Esto se hace usando \texttt{[let:long]} en lugar de la única letra de opción:
\begin{lstlisting}[language=bash]
USAGE="[k:kill]"
USAGE+="[l:level]#[level:=2]"
USAGE+="[s:stun]"
USAGE+="[t:tricorder]:?[life_form]"
while getopts "$USAGE" optchar ...
\end{lstlisting}
Aquí, hemos dividido cada opción en su propia línea para facilitar el seguimiento y las hemos concatenado usando el operador de asignación +=. Ten en cuenta que no hay saltos de línea en la cadena.
\item Dentro de los corchetes cuadrados de una letra de opción, permite que siga un texto descriptivo después de un signo de interrogación. Este texto se ignora, al igual que cualquier carácter de espacio en blanco, incluidos los saltos de línea:
\begin{lstlisting}[language=bash]
USAGE="[k:kill?Usar configuración de eliminación (predeterminado).]"
USAGE+="[l:level]#[level:=2?Establecer el nivel del phaser.]"
USAGE+="[s:stun?¡Solo aturdimiento!]"
USAGE+="[t:tricorder?Modo tricorder.]:?[life_form]"
while getopts "$USAGE" optchar ...
\end{lstlisting}
\item Ahora se pone interesante. Los encabezados de sección al estilo de la página man de Unix vienen \emph{antes} de la descripción de la opción. Se distinguen de las descripciones de las opciones al comenzar con un + dentro de corchetes cuadrados:
\begin{lstlisting}[language=bash]
USAGE="[+NOMBRE?phaser4 --- phaser y tricorder combinados]"
USAGE+="[+DESCRIPCIÓN?El programa phaser4 combina la operación "
USAGE+="de los programas phaser3 y tricorder en una herramienta práctica.]"
USAGE+="[k:kill?Usar configuración de eliminación (predeterminado).]"
USAGE+="[l:level]#[level:=2?Establecer el nivel del phaser.]"
USAGE+="[s:stun?¡Solo aturdimiento!]"
USAGE+="[t:tricorder?Modo tricorder.]:?[life_form]"
while getopts "$USAGE" optchar ...
\end{lstlisting}
Observa que \emph{getopts} comprende automáticamente que la descripción real de las opciones viene después de los encabezados de la página man; no hay un explícito \texttt{[+OPTIONS?...]} en el texto del string.
\item Se puede proporcionar texto adicional descriptivo para el resumen de uso corto después de la descripción de las opciones, separado por dos saltos de línea:
\begin{lstlisting}[language=bash]
USAGE="[+NOMBRE?phaser4 --- phaser y tricorder combinados]"
USAGE+="[+DESCRIPCIÓN?El programa phaser4 combina la operación "
USAGE+="de los programas phaser3 y tricorder en una herramienta práctica.]"
USAGE+="[k:kill?Usar configuración de eliminación (predeterminado).]"
USAGE+="[l:level]#[level:=2?Establecer el nivel del phaser.]"
USAGE+="[s:stun?¡Solo aturdimiento!]"
USAGE+="[t:tricorder?Modo tricorder.]:?[life_form]"
USAGE+=$'\n\narchivo ...\n\n' # Usa cadena ANSI C para el carácter \n
USAGE+="[+VER TAMBIÉN?phaser3(1), tricorder(1)]"
while getopts "$USAGE" optchar ...
\end{lstlisting}
\item Para indicar texto que debe cursivarse, enciérralo entre pares de caracteres \textbackslash{}a. Para indicar texto que debe ponerse en negrita, enciérralo entre pares de caracteres \textbackslash{}b:
\begin{lstlisting}[language=bash]
USAGE="[+NOMBRE?phaser4 --- phaser y tricorder combinados]"
USAGE+="[+DESCRIPCIÓN?El programa \aphaser4\a combina la operación "
USAGE+="de los programas \aphaser3\a y \atricorder\a en una herramienta práctica.]"
USAGE+="[k:kill?Usar configuración de eliminación (predeterminado).]"
USAGE+="[l:level]#[level:=2?Establecer el nivel del phaser.]"
USAGE+="[s:stun?¡Solo aturdimiento!]"
USAGE+="[t:tricorder?Modo tricorder.]:?[life_form]"
USAGE+=$'\n\narchivo ...\n\n' # Usa cadena ANSI C para el carácter \n
USAGE+=$'[+VER TAMBIÉN?\aphaser3\a(1), \atricorder\a(1)]'
while getopts "$USAGE" optchar ...
\end{lstlisting}
\item Es posible un control dinámico de la salida descriptiva. Para hacer esto, escribe una función que imprima lo que desees y luego encierra el nombre de la función entre un par de caracteres \textbackslash{}f: \textbackslash{}fname\textbackslash{}f (esto no es necesario para phaser4).
\item Si una opción (o cualquier otra cosa) necesita una descripción detallada, encerrar el texto entre { y } crea una lista sangrada. Esto es particularmente útil para describir diferentes valores de opción:
\begin{lstlisting}[language=bash]
USAGE="[+NOMBRE?phaser4 --- phaser y tricorder combinados]"
USAGE+="[+DESCRIPCIÓN?El programa \aphaser4\a combina la operación "
USAGE+="de los programas \aphaser3\a y \atricorder\a en una herramienta práctica.]"
USAGE+="[k:kill?Usar configuración de eliminación (predeterminado).]"
USAGE+="[l:level]#[level:=2?Establecer el nivel del phaser.]{ Añadir descripciones de valores
[level=0-2?configuraciones no letales]
[level=3-10?letales, usar con precaución]
}"
USAGE+="[s:stun?¡Solo aturdimiento!]"
USAGE+="[t:tricorder?Modo tricorder.]:?[life_form]"
USAGE+=$'\n\narchivo ...\n\n' # Usa cadena ANSI C para el carácter \n
USAGE+=$'[+VER TAMBIÉN?\aphaser3\a(1), \atricorder\a(1)]'
while getopts "$USAGE" optchar ...
\end{lstlisting}
\item Casi terminado. El texto entre corchetes cuadrados que comienza con un signo menos proporciona información de versión e identificación. Tal texto va al principio. El ítem vacío indica una versión y puede contener tanto cadenas de SCCS como de RCS, como se muestra aquí:
\begin{lstlisting}[language=bash]
USAGE=$'[-?\n@(#)$Id: phaser4 (Investigación y Desarrollo de la Flota Estelar)'
USAGE+=$' Stardate 57234.22 $\n]'
USAGE+="[-autor?J. Programador ]"
USAGE+="[-derechos?Copyright (c) Stardate 57000 Flota Estelar.]"
USAGE+="[-licencia?http://www.starfleet.mil.fed/weapons-license.xml23]"
USAGE+="[+NOMBRE?phaser4 --- phaser y tricorder combinados]"
USAGE+="[+DESCRIPCIÓN?El programa \aphaser4\a combina la operación "
USAGE+="de los programas \aphaser3\a y \atricorder\a en una herramienta práctica.]"
USAGE+="[k:kill?Usar configuración de eliminación (predeterminado).]"
USAGE+="[l:level]#[level:=2?Establecer el nivel del phaser.]{
[level=0-2?configuraciones no letales]
[level=3-10?letales, usar con precaución]
}"
USAGE+="[s:stun?¡Solo aturdimiento!]"
USAGE+="[t:tricorder?Modo tricorder.]:?[life_form]"
USAGE+=$'\n\narchivo ...\n\n' # Usa cadena ANSI C para el carácter \n
USAGE+=$'[+VER TAMBIÉN?\aphaser3\a(1), \atricorder\a(1)]'
while getopts "$USAGE" optchar ...
\end{lstlisting}
\item Finalmente, permite escapes dentro de las cadenas. \texttt{]]} representa un corchete de cierre literal cuando \emph{getopts} de otra manera podría interpretarlo como un corchete de cierre. De manera similar, ?? representa un signo de interrogación literal que de otra manera podría iniciar una descripción.
\end{enumerate}
Uff, ¡eso es mucha información! Sin embargo, verlo en el orden en que se agregó ayuda a que tenga sentido. Aquí tienes un resumen de los elementos que van en la cadena de uso, en el orden que requiere \emph{getopts}:
\begin{enumerate}
\item Las cadenas de identificación para la versión, autor, licencia, etc., son la primera parte. Están encerradas en corchetes y comienzan con un signo menos. El nombre del ítem, como <<author>>, sigue el signo menos y termina en un signo de interrogación. Después del signo de interrogación viene la información asociada.
El ítem vacío indica información de versión y debe tener la forma mostrada anteriormente; \emph{getopts} elimina los caracteres de identificación especiales de SCCS y RCS.
\item Las secciones y el texto de estilo de la página de manual de Unix vienen a continuación. Están encerrados en corchetes y comienzan con un signo más. El nombre de la sección termina en el carácter ?, y el texto descriptivo sigue.
El texto separado por dos nuevas líneas desde la descripción de las opciones se añade al mensaje breve de uso.
\item Las descripciones de las opciones forman la tercera sección. Todavía se permite la forma corta original, como se describió en el \hyperref[sec:Chapter6]{Capítulo 6}:
\begin{itemize}
\item Usa : para opciones que requieren argumentos.
\item Usa \# para opciones que requieren argumentos numéricos.
\item Usa :? y \#? para opciones que permiten argumentos pero no los requieren.
\end{itemize}
\item Sigue las opciones con un texto descriptivo entre [ y ]. Usa := dentro del texto descriptivo para especificar un valor predeterminado para un argumento de opción.
\item Las opciones largas se emparejan con una letra de opción corta encerrándolas entre corchetes y separándolas por dos puntos. Esto reemplaza la forma de una sola letra.
\item Encierra entre dos caracteres \texttt{\textbackslash{}a} los elementos que se deben cursivar. Encierra entre dos caracteres \texttt{\textbackslash{}\b} los elementos que se deben poner en negrita. Encierra el nombre de una función de personalización a llamar entre dos caracteres \texttt{\textbackslash{}f}.
\item Usa \{ y \} para encerrar descripciones de opciones anidadas e indentadas.
\item Sigue la sección de opciones con dos nuevas líneas y texto adicional para el resumen de las opciones cortas.
\item Usa \texttt{]]} para representar un corchete de cierre literal y \texttt{??} para representar un signo de interrogación literal.
\end{enumerate}
Aquí está la versión esquelética de \emph{phaser4}:
\begin{lstlisting}[language=bash]
#! /bin/ksh
# uso: phaser4 [ opciones ] archivos
# -k, --kill usa la configuración de matar (predeterminado)
# -l n, --level n establece el nivel del phaser (predeterminado = 2)
# -s, --stun usa la configuración de aturdir
# -t [lf], --tricorder [lf] modo tricorder, escaneo opcional para la forma de vida lf
USAGE=$'[-?\n@(#)$Id: phaser4 (Investigación y Desarrollo de la Flota Estelar)'
USAGE+=$' Fecha estelar 57234.22 $\n]'
USAGE+="[-autor?J. Programador <J.Prog@r-d.starfleet.mil.fed>]"
USAGE+="[-copyright=Derechos de autor (c) Fecha estelar 57000 Flota Estelar.]"
USAGE+="[-licencia?http://www.flotaestelar.mil.fed/licencia-armas.xml23]"
USAGE+="[+NOMBRE?phaser4 --- combinación de phaser y tricorder]"
USAGE+="[+DESCRIPCIÓN?El programa \aphaser4\a combina la operación "
USAGE+="de los programas \aphaser3\a y \atricorder\a en una herramienta práctica.]"
USAGE+="[k:kill?Usar configuración de matar (predeterminado).]"
USAGE+="[l:level]#[level:=2?Establecer el nivel del phaser.]{
[0-2?configuraciones no letales]
[3-10?letales, usar con precaución]
}"
USAGE+="[s:stun?Solo aturdir.]"
USAGE+="[t:tricorder?Modo tricorder.]:?[life_form]"
USAGE+=$'\n\narchivo ...\n\n'
USAGE+=$'[+VER TAMBIÉN?\aphaser3\a(1), \atricorder\a(1)]'
kill=1 aturdir=0 nivel=2 # valores predeterminados
tricorder=0 phaser=1
life_form=
while getopts "$USAGE" optchar ; do
case $optchar in
k) kill=1 aturdir=0 ;;
s) kill=0 aturdir=1 ;;
l) level=$OPTARG
if ((level < 0)) ; then
level=0 ;
fi
if ((level > 10)) ; then
level=10 ;
fi
;;
t) phaser=0 tricorder=1
life_form=${OPTARG:-"desconocido_general"}
;;
esac
done
print kill=$kill
print aturdir=$aturdir
print level=$level
print phaser=$phaser
print tricorder=$tricorder
print life_form=$life_form
\end{lstlisting}
Aquí está la salida de \texttt{phaser4 --man}:
\begin{lstlisting}[language=bash]
NAME
phaser4 --- combinación de phaser y tricorder
SYNOPSIS
phaser4 [ opciones ] archivo ...
DESCRIPTION
El programa phaser4 combina la operación de los programas phaser3 y tricorder
en una herramienta práctica.
OPTIONS
-k, --kill Usar configuración de kill (predeterminado).
-l, --level=level Establecer el level del phaser.
level=0-2
configuraciones no letales
level=3-10
letales, usar con precaución
El valor predeterminado es 2.
-s, --stun Solo aturdir.
-t, --tricorder[=life_form]
Modo tricorder. El valor de la opción puede omitirse.
SEE ALSO
phaser3(1), tricorder(1)
IMPLEMENTATION
version phaser4 (Investigación y Desarrollo de la Flota Estelar) Fecha estelar
57234.22
autor J. Programador
copyright Copyright (c) Fecha estelar 57000 Flota Estelar.
license http://www.flotaestelar.mil.fed/licencia-armas.xml23
\end{lstlisting}