UNIX V7 Para Principiantes

peron:~$ cat manual_unixv7_principiantes.txt

Prefacio

El UNIX Séptima Edición (denominado restrospectivamente como Unix V7) fue - a finales de 1978 - el primer UNIX de los laboratorios Bell en resultar distribuido con licencia para su uso institucional y comercial. Como tal, se hizo evidente un esfuerzo tendiente a proveerlo con documentación impresa de alta calidad, que lo distinguiría en el ambiente académico.

En particular, Brian W. Kerningham escribió en Murray Hill, Nueva Jersey, varios de los volúmenes. Para ello usó el mismo sistema poniendo cierto énfasis en una esquela destinada "a principiantes". Se basó en documentación que Ritchie y él mismo habían distribuído a las mecanógrafas del Departamento de Legales y de Patentamiento del Laboratorio. Esta segunda edición del manual "UNIX para Principiantes" constituiría un modelo de enseñanza en el uso de sistemas operativos multiusuario, y se presenta aún como una herramienta válida.

Si bien hoy en día ciertas estructuras y sobre todo el uso de UNIX como ambiente de preparación documental no tiene tanta relevancia como entonces, Kerningham acerca generalidades del día a día en el trabajo con UNIX, y detalla ciertos aspectos colaborativos en línea que permearían en BSD y luego GNU y demás sistemas operativos modernos.


Para acceder a un UNIX V7 accesible remotamente, se puede ingresar:

ssh menu@tty.livingcomputers.org
y en el menú elegir:
Opción 1). (Proceder al submenú de Sistemas UNIX),
    Opción a). ("Miss Piggy", DEC PDP-11/70 con UNIX v7

Loguéese con el usuario "lcm". Paracerrar sesión prfesione Ctrl+d y luego Ctrl+] y en el menú telnet> escriba quit., o Ctrl+] para volver al menú-

~peron


UNIX para Principiantes - 2da Edición.

Brian W. Kerningham

Laboratorios Bell

Murray Hill, Nueva Jersey (07974)

INTRODUCCIÓN

Desde el punto de vista del usuario, el sistema operativo UNIX es fácil de aprender y utilizar, y presenta pocos de los impedimientos usuales que complican hacer un trabajo. Resulta difícil para el principiante, sin embargo, saber dónde comenzar, y cómo hacer el mejor uso de las facilidades puestas a su disposición. El propósito de esta Introducción es asistir a los nuevos usuarios a acostumbrarse a las ideas principales del sistema UNIX y comenzar a hacer un uso efectivo del mismo de manera rápida.

En la medida que lea este documento, debe contar con usted con un par de documentos para simple referencia adicional. El más importante es el Manual del Programador de UNIX; de hecho es más sencillo referir la lectura de un tema del manual que repetir sus contenidos aquí. El otro documento útil es Un Tutorial Introductorio al Editor de Texto UNIX, que informará como utilizar el editor para introducir texto (programas, datos, documentos) en el ordenador.

Unas palabras de advertencia: el sistema UNIX se ha vuelto bastante popular, y existen algunas variantes principales en amplio uso. Por supuesto los detalles también camb ian con el tiempo. De modo que aunque la estructura básica de UNIX y cómo utilizarlas son comunes a todas estas versiones, también ciertamente existirán algunas cosas que son diferentes en su sistema de lo que aquí se describe. Hemos intentado minimizar el problema, pero debe estar al tatno de ellas. En caso de duda, este documento describe al Unix Versión 7.

(...)

I. COMENZANDO

Loguearse

Usted debe contar con un nombre de login de UNIX, que podrá obtener de quien administre su sistema. También neecesita conocer el número telefónico, a no ser que su sistema utilice terminales de conexión permanente. El sistema UNIX es capaz de entenderse con una amplia variedad de terminales: Terminet 300 Exuport, TI y portátiles similares, videoterminales (CRT) como la HP2640, terminales gráficas de alta gama como la Tektronix 4014, terminales de trazado como las de GSI y DAI; e incluso las venerables terminales teletipos en sus varias formas. Pero considere que UNIX está fuertemente orientado a dispositivos con minúsculas. Si su terminal produce únicamente mayúsculas, (por ejemplo, el teletipo Modelo 33, y ciertas terminales de video y portátiles) la vida le será tan difícil que debería buscar otra terminal.

Asegúrese de configurar los conmutadores de su dispositivo apropiadamente. Los conmutadores que podría necesitar ajustar incluyen a los de velocidad, modo de mayúsculas/minúsculas, full dúplex, paridad en par, y otros que se recomienden de forma local. Establezca la conexión empleando el procedimiento necesario de su terminal; este podría involucrar discar una llamada telefónica o simplemente presionar un interruptor. En cualquiera de los casos, UNIX debería presentarle un "login:", Si aparece basura escrita, puede deberse a una velocidad de conexión errónea: revise los conmutadores. Si ello falla, pulse la tecla "BREAK" o "INTERRUPT" varias veces, de forma lenta. Si tras ello aún falla en producir el mensaje de loguin, consulte un gurú.

Cuando obtenga el mensaje login:, mecanografíe su nombre de login en minúscula, seguido por la tecla RETURN (el sistema no hará nada hasta que presione RETURN). Si se requiere una contraseña, se le solicitará tipearla, y - de ser posible - la impresión se detendrá mientras la mecanografía. No olvide presionar RETURN.

La culminación de sus esfuerzos de alta será un "carácter de veña" (prompt), un único caracter impreso que indica que el sistema está listo para aceptar sus ordenes. El caracter de veña es usualmente un signo pesos $ o un signo de porcentaje %. (En ocasiones podría obtener un mensaje del día justo antes del caracter de veña, o una notificación de que tiene correo).

Mecanografiar Mandatos

Una vez que ha visto el caracter de veña, podrá ingresar mandatos, las cuales son ordenes para que el sistema cumpla. Intente meganografiar

$ date

seguido de RETURN. Debería recibir como respuesta algo como:

Lun Ene 16 13:18:10 EST 1978

No olvide la tecla RETURN luego del mandato, o no sucederá nada. Si piensa que está siendo ignorado, presine RETURN; algo debería suceder. No será mencionado nuevamente lo de presionar RETURN, pero no la olvide: debe ser presionada al final de cada orden.

Otra orden que podría intentar es who, la cual le informará quiénes se encuentran actualmente en línea:

$ who

...devolverá algo como:

mb   tty01   Ene 16 12:11
ski  tty04  Ene 16 11:54
gam  tty11  Ene 16 13:34

La hora indica cuándo ingresó el usuario en línea, "ttyxx" le da una idea de cuál número de terminal de sistema está utilizando el usuario.

Si comete un error al mecanografiar su orden, refiriendo un mandato inexistente, se le avisará. Por ejemplo, si mecanografía:

$ whom

...se le dirá

whom: not found

Por supuesto, si inadertidamente mecanografía el nombre de algún otro mandato, correrá, con resultados más o menos misteriosos.

Comportamiento extraño de la Terminal

A veces puede dar con un estado donde su terminal se comporte de forma extraña. Por ejemplo, podrían aparecer letras duplicadas, o la tecla RETURN podría no provocar una alimentación de línea o retornar al margen izquierdo. A menudo esto puede corregirse cerrando sesión y volviendo a entrar en línea. O podría leer la descripción del mandato stty en la sección I del manual. Para obtener un tratamiento inteligente de los caracteres de tabulación (los cuales son muy utilizados en UNIX) si su terminal no tiene tabulador, introduzca el mandato:

$ stty -tabs

...y el sistema convertirá por usted cada tabulación en la cantidad adecuada de espacios en blanco. Si su terminal cuenta con tabulaciones configurables por computadora, el mandato tabs lo configurará adecuadamente para usted.

Errores de mecanografiado.

Si comete errores de mecanografiado y los advierte en la medida que escribe antes de presionar RETURN, existen dos formas de corregirlos. El caracter # borra el último caracter ingresado; de hecho el uso sucesivo de # volverá al comienzo de la línea (pero no por encima). De modo que no es bueno mecanografiando, podrá ver sus correciones en la medida que las realiza:

$ dd#atte##e

...es lo mismo que date.

El signo @ se encarga de borrar todos los caracteres que ha mecanografiado hasta ahora en la línea de entrada actual, de modo que si la línea está irrecuperablemente errada, presionando una @ le permitirá comenzar a mecanografiar la línea de nuevo.

¿Qué sucede si desea ingresar un caracter # o @ en su texto? Si precede al # o la @ con una barra invertida \, estos perderán su comportamiento de borrado. De modo que para ingresar un # o una @ propiamente dichos, escriba \# o \@. El sistema siempre hará eco de una nueva línea cuando use una \, incluso si la procede por una barra invertida. No se preocupe, la @ quedará registrada.

Si necesita borrar una barra invertida, debe ingresar doble # o doble @, como en \## o \@@. En UNIX la barra invertida se usa extensamente para indicar que el siguiente caracter es, de alguna manera, especial.

Lectura Anticipada

UNIX cuenta con lectura anticipada completa, lo que significa que puede mecanografiar tan rápico como quiera, siempre que lo desee (incluso cuando algún comando le está mecanografiando a usted). Si mecanografía durante una impresión de salida en su terminal, los caracteres que ingresen aparecerán entremezclados con los caracteres de salida, pero serán almacenados e interpretados en el orden correcto. De modo que puede mecanografiar varios comandos uno ldetrás de otro sin esperar a que el primero finalice o siquiera comience.

Detener un Programa

Podrá detener la mayoría de los programas presionando el caracter "DEL" (tal vez teclas llamados "DELETE" o "RUBOUT" en su terminal). También se usa la tecla "Interrupt" o "Break" encontrada en la mayoría de los terminales. En unos pocos programas, como el editor de texto, DEL detiene cualquier cosa que el programa esté haciendo, pero lo deja en dicho programa. Colgar el teléfono detendrá la mayoría de los programas.

Cerrar la sesión.

La manera más fácil de cerrar la sesión es colgar el teléfono. También puede mecanografiar:

$ login

...y dejar que alguien más use el terminal en donde se encuentra. Usualmente no sólo es suficientente desconectar el terminal. La mayoría de los sistemas UNIX no usan un mecanismo de agote de tiempo, de modo que estará en línea para siempre a no ser que cuelgue.

Correo

Cuando usted entra a su sesión, podría en ocasiones recibir el mensaje "Usted tiene correo":

You have mail.

UNIX provee un sistema postal de modo que pueda comunicarse con otros usuarios en el sistema. Para leer su correo, ingrese el mandato:

$ mail

Su correo resultará impreso, un mensaje por vez, comenzando por el mensaje más reciente. Luego de cada mensaje, mail esperará que le indique qué desea hacer con el. Las dos respuestas básicas son d, que borra el mensaje, y RETURN, que no lo hace (por lo cual permanecerá allí la siguiente vez que consulte su casilla de correo). Otras respuestas se describen en el manual. (Las primeras versiones de mail no procesan un mensaje por vez, pero son similares en lo demás).

¿Como se envía correo a alguien mas? Suponga que desea escribir a "juan" (asumiendo que "juan" es el nombre de usuario de alguien). La forma más sencilla es:

$ mail juan
Aqui escriba el texto de la carta que desea enviar,
tantas líneas como lo desee...
Luego de la última línea de la carta
mecanografíe el caracter "Control+d",
esto es, mantenga presionada la tecla CONTROL y presione la letra D.

Y ya está. La secuencia Ctrl+d - a menudo llamada EOF o "fin de fichero" - se usa en todo el sistema para marcar el cese de entrada desde un terminal, de modo que podría bien acostumbrarse.

Para practicar, envíese un correo a usted mismo (esto no es algo tan extraño como podría parecer; enviarse correo a uno mismo es un mecanismo recordatorio útil).

Existen otras maneras de enviar correo: podría enviar una carta previamente preparada, y podría enviarla a una cantidad grande de personas, todas a la vez. Para más detalles, vea mail en el Manual del Programador UNIX.)

Escribir a otros usuarios

En algún momento, de la nada podría arribarle un mensaje como:

Message from juan tty07

...acompañado por un campanazo de alerta. Esto significa que Juan le desea hablar, pero a no ser que usted tome una acción explícita, no podrá responder. Para responder, mecanografíe el mandato:

$ write juan

Esto establecerá un enlace de comunicación de dos vías. Ahora cualquier cosa que Juan mecanografíe en su terminal aparecerá en el suyo y viceversa. Esta comunicación es lenta, similar a hablar a la luna (si está en el medio de algo, podría tener un estado donde podría mecanografiar un comando. Normalmente, cualquier programa que esté ejecutando debe terminar o ser terminado. Si está editando, podrá escapar temporalmente del editor (lea el tutorial del editor).

Es necesario seguir un acuerdo para impedir que lo que mecanografía Carla termine entremezclandose con lo que mecanografía Juan. El protocolo típico es así:

Si escribe a alguien quien no se encuentra en línea - o a quien no desea ser molestado - se le avisará. Si la otra parte se encuentra en línea pero no constesta luego de un intervalo decente, simplemente presione "Control+d".

Manual en línea.

Típicamente el Manual de Programador de UNIX se mantiene en línea. Si se atasca con algo y no puede encontrar un experto que lo asista, puede imprimir en su terminal alguna sección del manual que le resulte útil para resolver su predicamento. Esto también resulta útil para obtener la información más actualizada de un mandato. Para imprimir una sección del manual, mecanografíe "man nombre-mandato". Por lo tanto, para leer acerca del mandato who, mecanografíe:

$ man who

...y, por supuesto,

$ man man

...le dirá sobre el mandato man.

Instrucción Asistida por Computadora

Su sistema UNIX podría disponer de un programa llamado learn, que provee instrucciones asistidas por computadora sobre el sistema de archivaje y sus mandatos básicos, el editor, la preparación de comandos e incluso sobre programación en C. Intente mecanografiar la orden:

$ learn

En caso que learn exista en el sistema, se le informará que hacer a partir de allí.

II. USO DIARIO

Crear ficheros - El Editor

Si tiene un documento, una carta o un programa ¿cómo almacena dicha información en la máquina? La mayoría de estas tareas se realizan con el "editor de texto" de UNIX, ed. Ya que ed está documentado extensamente y explicado en Un Tutorial de Introducción al Editor de Texto UNIX, no invertiremos tiempo describiendo aquí cómo usarlo. Todo lo que deseamos por ahora es hacer algunos ficheros. Un fichero es sólo una colección de información almacenada en la máquina, una definición simplista pero adecuada.

Para crear un fichero llamado basura con algun texto en él, haga lo siguiente.

$ ed basura (invoca el editor de texto ed)
a             (manda a ed para agregar texto)
mecanografíe ahora cualquier texto que desee.
.             (señala el final del agregado de texto.

Es importante que el "." que señala el final del agregado de texto debe mecanografiarse necesariamente al comienzo de una línea vacía. No olvide que hasta que no presione el . aislado, no será reconocido ningún otro mandato. Todo lo que mecanografíe será considerado texto a agregar.

En este momento podrá realizar cualquiera de las varias operaciones de edición al texto que ha agregado, tal como corregir errores de ortografía, rearreglar párrafos, etcétera. Finalmente, deberá escribir la información que ha mecanografiado en un fichero, con el mandato w del editor:

w

ed responderá indicando el número de caracteres que se han escrito en el fichero basura.

Tenga presente que hasta que no introduzca el mandato w, nada se almacenará de manera permantente, de modo que si hubiese colgado para marcarse a su casa, la información se perdería. Mas luego de indicar w, la información se resguardará permanentemente, y podrá acceder a ella nuevamente en cualquier momento ordenando:

$ ed basura

Ingrese el mandato q para salir del editor. Si intenta salir sin escribir los datos, ed imprimirá un indicativo "?" en su terminal. Un segundo q lo hará salir sin siquiera darle importancia.

De la misma manera, cree ahora un segundo fichero llamado temp. Debería contar ahora con dos ficheros, basura y temp.

¿Qué ficheros hay allí afuera?

El mandato ls (para "listar") listará los nombres (no los contenidos) de cualquiera de los ficheros de los que UNIX conoce. Si mecanografía:

$ ls

...la respuesta será:

basura
temp

...que son - de hecho - los dos ficheros que acaba de crear. Los nombres resultan ordenados automáticamente según el alfabeto, pero existe la posibilidad de utilizar otras variaciones. Por ejemplo, el mandato:

$ ls -t

provoca que los ficheros resulten listados en el órden temporal en el cual fueron cambiados por última vez. La opción -l le da un listado "largo".

$ ls -l

...y producirá algo como:

-rw-rw-rw1 juan 41 jul 22 2:56 basura
-rw-rw-rw1 juan 78 jul 22 2:57 temp

La fecha y hora son las últimas en las cuales modificó el fichero. El 41 y 78 constituyen la cantidad de caracteres (que deben coincidir con los números que le informó ed). juan es el propietario de los ficheros, esto es, la persona que los creó. El -rw-rw-rw- indica quien tiene permiso de leer y escribir el fichero. En este caso, todos.

Las opciones pueden combinarse: ls -lt le dará el mismo resultado que ls -l, pero ordenado por tiempo. Podrá también nombrar los ficheros en los cuales está interesado, y ls unicamente le listará la información de ellos. Para mas detalles consulte ls.

El uso de estos argumentos opcionales que comienzan con un signo menos, como -t y -lt, constityen una convención común para los programas UNIX. En general, si un programa acepta tales argumentos opcionales, estos preceden cualquier argumento de nombre de fichero. También es vital que separe los argumentos varios con espacio. ls-l no es lo mismo que ls -l.

Imprimir ficheros

Ahora que cuenta con un fichero de texto, ¿cómo lo imprime para que la gente pueda mirarlo? Existe una variedad de programas que hacen esto, probablemente más de los necesarios.

Una cosa simple es usar el editor, ya que la impresión a menudo se hace justo antes de hacer cambios, de todos modos. Podrá decir

$ ed basura
l,$p

y ed responderá con el conteo de los caracteres en el fichero basura y luego imprimirá todas las líneas del fichero. Luego de aprender cómo usar el editor, podrá ser selectivo sobre qué partes desea imprimir.

Existen ocasiones donde no es factible utilizar el editor para imprimir. Por ejemplo, existe un límite de tamaño de fichero que ed puede manejar (es de varios miles de líneas). En segundo lugar, sólo puede imprimir un fichero a la vez, y en ocasiones podría querer imprimir varios, uno a continuación de otro. De modo que se ofrecen a continuación un par de alternativas.

La primera es utilizar cat, el más simple de todos los programas de impresión. cat simplemente imprime en el terminal los contenidos de todos los ficheros nombrados en una lista. Por lo tanto:

$ cat basura

...imprime un fichero, y

$ cat basura temp

imprime dos. Los ficheros son simplemente concatenados en el terminal (de aquí el nombre "cat").

pr produce impresiones con formato de ficheros. Al igual que cat, pr imprime todos los ficheros listados por nombre. La diferencia es que produce encabezados con la fecha, hora, número de página y nombre de fichero en la parte superior de cada págica, y líneas extra para saltear el doblez del mazo de hojas continuas microperforadas. Por lo tanto,

$ pr basura temp

imprimira basura ordenadamente, luego saltará a la parte superior de una nueva página, e imprimirá temp prolijamente.

pr también puede producir salida multicolumnas:

$ pr -3 basura

imprime basura a 3 columnas. Podrá solicitar cualquier número razonable en lugar de "3" y pr hará lo mejor que pueda. pr tiene otras capacidades también. Consulte pr.

Debería notarse que pr no es un programa de formato en el sentido de organizar las líneas y justificar los márgenes. Los verdaderos programas de ejecución de formato son nroff y troff, que describiremos en la sección sobre Preparación Documental.

También existen programas que imprimen ficheros en una impresora de alta velocidad. Busque en su manual sobre opr y lpr. Cual utilizar dependerá del equipamiento conectado a su máquina.

Trabajo con ficheros

Ahora que cuenta con algunos ficheros en el sistema de archivaje y cierta experiencia en imprimirlos, puede intentar cosas mayores. Por ejemplo, podrá mudar un fichero de un lugar a otro (lo que equivale a darles un nuevo nombre), de esta manera:

$ mv basura tesoro

Esto significa que lo que antes era "basura" ahora es "tesoro". Si usa un comando ls ahora, obtendrá:

tesoro
temp

Comprenda que si muda un fichero en otro que ya edxiste, el contenido existente se perderá para siempre.

Si desea hacer una copia de un fichero - esto es, contar con dos versiones de algo - podrá usar el mandato cp.

$ cp tesoro temp1

...produce un duplicado por copia del fichero tesoro en el fichero temp1.

Finalmente, cuando se canse de crear y mover ficheros, existe un mandato para remover ficheros del sistema de archivaje, llamado rm.

$ rm temp temp1

...removerá ambos ficheros nombrados.

Obtendrá un mensaje de advertencia si uno de los ficheros nombrados no estaba allí, pero de otra manera rm - como la mayoría de los mandatos de UNIX - hace su trabajo de forma silenciosa. No hay preguntas ni charla, y los mensajes de error son ocasionalmente cortos. Esta tersitud es a menudo desconcertante a los novatos, pero los usuarios experimentados la encuentran deseable.

¿Que hay en un nombre de fichero?

Hasta aquí hemos utilizado nombres de fichero sin siquiera decir lo que es un nombre legal, de modo que es tiempo de explicar un par de reglas. Primero, los nombres de ficheros se limitan a 14 caracteres, lo cual es suficiente para ser descriptivo. Segundo, aunque en un nombre de fichero es posible utilizar casi cualquier caracter, el sentido común dice que debería apegarse a aquellos que son visibles, y que probablemente debería evitar caracteres que podrían ser utilizados con otros significados. Hemos visto ya, por ejemplo, que en el mandato ls, ls -t significa listar en orden de hora. De modo que si usted tuviese un fichero cuyo nombre es -t, tendría problemas para listarlo. Además del signo menos, existen otros caracteres que tienen un significado especial. Para evitarse problemas, debería tener a bien utilizar sólo letras, números y el punto, al menos hasta familiarizarse con dicha situación.

Una sugerencia algo más positiva. Suponga que está mecanografiando un gran documento como un libro. Logicamente este se divide en muchas piezas pequeñas, tal como capítulos y tal vez secciones. Físicamente debe dividirse, también, ya que ed no podrá manejar ficheros demasiado grandes. Por lo tanto, debe mecanografiar tal documento en forma de cierta cantidad de ficheros. Podría tener que separar el fichero en cada capítulo llamado

cap1
cap2
etc...

...o, si cada capítulo está dividido en varios ficheros, podría tener:

cap1.1
cap1.2
cap1.3
...
cap2.2
cap2.2
...

Podrá ahora darse una idea donde se encontrará cierto fichero particular en lo que conforma el todo.

Existen ventajas en una convención de nombrado sistemático que no resultan obvias al usuario novel de UNIX. ¿Qué sucedería si desea imprimir el libro entero? Usted diria

$ pr cap1.1 cap1.2 cap1.3 ...

pero podría cansarse muy rápido, y probablemente incluso cometería errores. Afortunadamente, existe un atajo. Podria decir:

$ pr cap*

El * significa "absolutamente todo" de modo que esto se traduce a "imprime todos los ficheros cuyo nombre comienzan con cap", listados en orden alfabético.

Esta notación abreviada no es una propiedad del comando pr, de hecho. Se trata de un servicio que alcanza a todo el sistema provisto por el programa que interpreta los mandatos (la "shell" sh). Sabiendo este hecho, puede observar cómo listar los nombres de los ficheros del libro:

$ ls cap*

produce:

cap1.1
cap1.2
cap1.3
...

El * no se limita a la última posición en un nombre de fichero: puede asentarse en cualquier lugar y puede ocurrir varias veces. Por lo tanto:

$ rm *basura* *temp*

...removerá todos los ficheros que contenga basura o temp como cualquier parte de su nombre. Como caso especial, el * por si mismo representa a todos el nombre del fichero, de modo que:

$ pr *

...imprime todos sus ficheros (en orden alfabético), mientras que para remover todos los ficheros usaría

$ rm *

(Es mejor que esté completamente que esto era lo que quería decir).

El * no es la única funcionalidad de coincidencia de patrones disponible. Suponga que desea imprimir sólo los capítulos 1 al 4 y el 9. Podría decir:

$ pr cap[12349]*

Como ve, atmbién puede indicar las letras entre corchetes: [a-z] buscará coidicedncias de cualquier caracter en el rango de la a la z.

El ? busca coincidencias de patrones para un único caracter, de modo que

$ ls ?

devuelve una lista de todos los ficheros que cuentan con nombres de un solo caracter, y

$ ls -l cap?.1

lista información sobre el primer fichero de cada capítulo (cap1.1, cap2.1, etcétera).

De todas estas conveniencias, ciertamente * es la más útil, y debería acostumbrarse a ella. Las otras son interesantes, pero merecedoras de conocerse.

Si debe anular el significado especial de uso para *, ?, etcétera, encierre el argumento entero entre apóstrofos '...', como en

$ ls '?'

Veremos algunos ejemplos más en breve.

¿Que hay en un Nombre de Fichero?, Continuación

Cuando usted creó aquel fichero llamado basura, ¿cómo supo el sistema que no había otro basura en algún otro sitio, especialmente porque la persona en la oficina lindera probablemente también leía este tutorial? La respuesta es que generalmente cada usuario cuenta con un directorio privado, que contiene sólo los ficheros que le pertenecen. Cuando usted se conecta, estrá "en" su directorio. A no ser que realice acciones especiales, cuando crea un nuevo fichero, lo hace en el directorio en el cual está actualmente; este muy a menudo es su propio directorio, y por lo tanto el fichero no estará relacionado a ningún otro fichero del mismo nombre que pudiese existir en el directorio de alguien mas.

El conjunto de todos los ficheros se organizana la manera de un árbol (usualmente grande) cuyos ficheros se encuentran dispuestos en varias ramas del árbol. Le será posible "trepar" a lo largo de este árbol, y encontrar que cualquier fichero en el sistema, comenzando desde la raíz del árbol y desplazándose a través de sus ramas. Conversamente, podrá comenzar donde está ahora y descender de rama en ramaha hasta la raíz.

Intentemos esto primero. La herramientas básica es el mandato pwd ("imprimir directorio de trabajo"), que imprime el nombre del direcotrio en el que se encuentra actualmente, si introduce el mandato pwd, imprimirá algo como

/usr/sunombre

Esto dice que se encuentra acctualmente en el directorio sunombre, que está de hecho localizado en el directorio /usr, que de hecho está en el directorio raíz, llamado por convención simplemente /. Incluso si no se llame /usr en su sistema, obtendrá algo análogo. Tenga en cuenta la variación correspondiente y continúe leyendo.

Si ahora mecanografía:

$ ls /usr/sunombre

...debería obtener exactamente la misma lista de nombres de ficheros que obtuvo cuando usó un simple ls: si no ha sido argumentado, ls listará los contenidos del directorio actual; dado el nombre de un directorio, listará los contenidos de tal directorio.

A continuación intente

$ ls /usr

Esto debería imprimir una larga serie de nombres, entre los cuales estará su propio nombre de login, sunombre. En muchos sistemas, usr es un directorio que contiene los directorios de todos los usuarios normales de dicho sistema, como el suyo.

El siguiente paso es intentar:

$ ls /

Debería obtener en respuesta algo como esto (aunque nuevamente, los detalles pueden ser diferentes):

bin
dev
etc
lib
tmb
usr

Esta es una colección de directorios básicos de ficheros que el sistema conoce, estamos en la raíz del árbol.

Ahora intente:

$ cat /usr/subombre/basura

(si basura aún está dando vueltas en su directorio). El nombre

/usr/sunombre/basura

se conoce como la "ruta" del fichero que normalmente piensa como "basura". La "ruta" tiene un significado obvio: representa el nombre completo de la ruta que debe seguir desde la raíz a través de las ramas de directorios para llegar al fichero particular. Es una regla universal en el sistema UNIX que en cualquier lugar donde es posible utilizar un nombre de fichero ordinario, también podrá utilizar una ruta.

He aquí una imagen que lo hara más claro

       root
        /|\
       / | \
bin etc usr dev tmp
/|\ /|\ /|\ /|\ /|\
       / | \
   adan eva maria
        / \  \
       /   \  \
  basura temp basura

Note que la basura de María no guarda relación con la de Eva.

Esto no es demasiado excitante si todos los ficheros de interés se encuentran en su propio directorio. Pero si trabaja con alguien más o con varios proyectos concurrentes, re resultará bastante útil, de hecho. Por ejemplo, sus amigos podrían imprimir su libro diciendo:

$ pr /usr/sunombre/cap*

Similarmente, podrá descubrir qué ficheros tiene su vecino diciendo

$ ls /usr/nombre_vecino

...o hacer su propia copia de uno de sus ficheros con:

$ cp /usr/us_vecino/su_fichero mi_copia

Si su vecino no quiere que un vecino hurgue en sus ficheros, o viceversa, la privacía puede ajustarse. Cada fichero y directorio tiene sus permisos de lectura-escritura-ejecución para el propietario, un grupo, o todos los demás, que se pueden disponer para controlar el acceso. Vea ls y chmod para más detalles. Como hecho observado, la mayoría de los usuarios la mayoría del tiempo ecnuentran que la apertura es más beneficiosa que la privacía.

Como experimento final con rutas, intente

$ ls /bin /usr/bin

¿Alguno de los nombres le resulta familiar? Cuando corre un programa, mecanografiando su nombre luego del caracter de veña, el sistema simplemente busca un fichero con dicho nombre. Normalmente busca primero en su directorio (donde típicamente no lo encontrará), luego en /bin y finalmente en /usr/bin. No hay nada mágico sobre los mandatos como cat o ls, excepto que han sido colectados en un par de lugares para encontrarlos y administrarlos fácilmente.

¿Qué sucedería si trabaja regularmente con alguien más en información común en su directorio? Podría simplemente loguearse como su amigo cada vez que lo desee, pero también puede decir "quiero trabajar en sus ficheros en lugar de los míos". Esto se realiza cambiando el directorio en el que se encuentra actualmente:

$ cd /usr/su_amigo

(En algunos sistemas, cd se escribe chdir). Ahora cuando use un nombre de fichero en algo como cat o pr, referirá al fichero en su directorio de su amigo. Cambiar los directorios no afecta cualquier permiso asiciado con un fichero. Si no puede acceder un fichero desde su propio directorio, cambiarlo al directorio de alguien más, no se altere por ello. Por supuesto, si olvida en qué directorio se ecuentra, ingrese:

$ pwd

para descubrirlo.

Usualmente es conveniente ordenar sus propios ficheros de modo que todos los ficheros relacionados a una cosa se encuentren en un directorio separado de sus otros proyectos. Por ejemplo, cuando escriba un libro, podría querer mantener todos los textos en un direcotrio llamado libro, de modo que haga uno con

$ mkdir libro

luego vaya a el con:

$ cd libro

Luego puede comenzar a mecanografiar capítulos. El libro se encuentra ahora (presumiblemente) en

/usr/sunombre/libro

Para remover el directorio libro, mecanografíe

$ rm libro/*
$ rmdir libro

El primer mandato remueve todos los ficheros del directorio dejándolo vacío; el segundo remueve el directorio vacío.

Puede descender un nivel en la ramas del árbol de archivos diciendo:

$ cd ..

".." es el nombre de la rama madre de cualquier directorio en el cual se encuentre. Para completar el concepto, "." constituye un nombre alternativo para el directorio en el cual se encuentra.

Usar Ficheros en Lugar del Terminal

La mayoría de los mandatos que hemos visto hasta ahora producen salida en el terminal; algunos, como el editor, también toman su entrada desde el terminal. Es universal en los sistemas UNIX que el terminal puede ser reemplazado por un fichero ya sea tanto para entrada como salida. Por ejemplo:

$ ls

...hace una lista de ficheros en su terminal. Pero si ordena

$ ls >listaficheros

se colocará la lista de sus ficheros en el fichero listaficheros (que será creado en el mismo momento si ya no existía, o será sobreescrito si ya estaba presente). El símbolo > significa "coloque la salida en el siguiente fichero, en lugar de hacerlo en el terminal". Nada se producirá en el terminal. En otro ejemplo, podría combinar varios ficheros en uno solo capturando la salida del mandato cat en un fichero aparte:

$ cat f1 f2 f3 >temp

El símbolo >> opera de forma similar a como lo hace >, excepto que significa "agrega al final de...". Por lo tanto,

$ cat f1 f2 f3 >>temp

...significa concatenar los ficheros f1, f2 y f3, al final de cualquier cosa que ya existiese en el fichero temp, en lugar de sobreescribir los contenidos que ya existiesen allí. De la misma forma que con >, temp sería creado para usted, si no existiese.

De forma similar, el símbolo < significa "tomar la entrada de un programa desde el fichero a continuación", en lugar de hacerlo desde el terminal. Por lo tanto podría hacer una serie de mandatos de edición comunmente utilizados y colocarlas en un fichero denominado guion. Luego podría correr guion en un fichero, diciendo:

$ ed file <guion

Como otro ejemplo podría usar ed para preparar una carta en el fichero carta, y luego enviárselo a varias personas con:

$ mail adan eva maria juan <carta

Tubos

Una de las contribuciones noveles al sistema UNIX es el concepto de un "tubo". Un caño es simplemente una manera de conectar la salida de un programa a la entrada de otro programa, de modo que dos corran como secuencias de procesos, constituyendo una tubería.

Por ejemplo:

$ pr f g h

imprime los ficheros f, g y h, comenzando cada uno en una nueva página. Suponga en lugar de ello desea que corran juntos. Podría decir:

$ cat f g h >temp
$ pr <temp
$ rm temp

pero esto es más trabajo del necesario. Claramente lo que queremos es tomar la salida de cat y conectarla a la entrada de pr. De modo que utilizamos un tubo:

$ cat f g h | pr

La barra vertical | implica aquí "conectar la salida de cat, que normalmente iría a parar al terminal, y colocarla en la entrada de pr", con el fin de darle formato prolijo.

Existen muchos otros ejempos de tubos. Por ejemplo,

$ ls | pr -3

...imprime una lista de sus ficheros en tres columnas. El programa wc cuenta el número de líneas, palabras y caracteres en su entrada, y como lo vimos anteriormente, who imprime una lista de la gente actualmente en línea, una por línea. Por lo tanto:

$ who | wc

...le dirá cuanta gente se encuentra conectada, y por supuesto:

$ ls | wc

...contará los ficheros.

Cualquier programa que lee del terminal también es capaz de leer de un tubo; cualquier programa que escribe en el terminal puede llenar un tubo. En una tubería podrá colocar tantos elementos como desee.

Muchos programas de UNIX están escritos de modo que toman su entrada de uno o más ficheros - si se le otorga un fichero como argumento. Si no se les dan tales argumentos, leen desde el terminal, y por lo tanto pueden ser utilizados en las tuberías. pr es un ejemplo de ellos:

$ pr -3 a b c

imprime los ficheros a, b y c en orden en tres columnas, pero en:

$ cat a b c | pr -3

...pr imprimirá la información que le llega de la tubería, presentándola aún en tres columnas.

La Shell sh

Se ha mencionado una o dos veces a una misteriosa "shell", que es de hecho sh. Esta shell es un programa que interpreta lo que teclea en la teletipo como ordenes ("mandatos") y sus especificidades ("argumentos"). También es capaz de dilucidar ciertos "caracteres especiales" tales como * (en la lista de nombres de fichero), o bien >, < y | que actúan como directores de tránsito en lo que respecta al ingreso o egreso en el flujo de datos ("streams").

La shell sh también inauguró otras funciones. Por ejemplo, permite correr dos o más programas consecutivamente con un solo mandato, provisto que se separen dichos programas con un ";". La shell reconocerá el ; y dividirá la orden en respectivos mandatos de ejecución consecutiva. Por ejemplo, el mandato:

$ date;who

...significa "mando correr el programa date, consecutivamente correr el programa who y aguardar nuevas órdenes". Esto se saludando con el caracter veña ("prompt").

Está permitido estipular que dos o más programas se ejecuten en sumultáneo. Por ejemplo, si se encuentra haciendo algo que requiere mucho tiempo de cómputo (como correr un guión de edición sobre una sección de texto previamente editada), y no desea aguardar dicho resultado antes de comenzar otro trabajo de cómputo, es posible ordenar:

$ ed fichero <guion &

El "&" instruirá "mando dar inicio a la ejecución de microprograma ed aplicando instrucciones indicadas en el fichero guion, y aguarda nuevas órdenes desde el terminal de inmediato". O sea, no aguardará que esté completo. Por lo tanto el guión comenzará, pero podrá realizar otro trabajo al mismo tiempo. Por supuesto, para impedir que la salida interfiera con lo que está en la terminal, será mejor instruir:

$ ed fichero <guion >guion.salida &

...de esta manera las líneas de salida se almacenarán en un fichero llamado guion.salida.

Cuando inicie un mandato con &, el sistema contestará con un número conocido como "número de proceso", que indentifica dicho mandato en caso que luedo desee detenerlo. Si lo hace, podrá ordenar:

$ kill numero-de-proceso

Si olvida el número de proceso, el comando ps podrá decirle sobre todo lo que tiene en ejecución. (si está desesperado, kill 0 eliminará todos sus procesos). Y si es curioso sobre otra gente, ps a le informará sobre todos los programas que se encuentran ejecutándose actualmente.

Puede inicar:

$ comando1; comando2; comando3 &

...para comenzar tres comandos en segundo plano, o puede comenzar una tubería en segundo plano con:

$ comando1 | comando 2 &

De la misma forma en la que puede indicarle al editor o a algún programa similar recibir su entrada desde un fichero en lugar de hacerlo desde el terminal, podrá decirle a la shell que lea un fichero para obtener mandatos. (¿Porqué no? La shell, después de todo, es sólo un programa, aunque uno muy inteligente). Por ejemplo, supongamos que cada vez que se conecta desea establecer las tabulaciones de su terminal en el sistema, y descubrir la fecha y quien está en línea. En tal caso podrá disponer los tres comandos necesarios (tabs, date, who) en un fichero, y denominarlo inicio, y luego correrlo con la shell:

$ sh inicio

Esto le dice que corra la shell con el fichero inicio como entrada. El efecto es como si hubiese mecanografiado los comandos contenidos en inicio en el terminal.

Si quiere hacer esto muy corrientemente, podrá eliminar la necesidad de mecanografiar sh: simplemente mecanografíe por única vez la orden:

$ chmod +x inicio

...y de aquí en más sólo tendrá que mecanografiar:

$ inicio

para ejecutar tal serie de mandatos. El mandato chmod marca el fichero como ejecutable: la shell reconocerá esto y lo ejecutará tal como si fuese una serie de mandatos.

Si desea que inicio corra automáticamente cada vez que se da de alta en el sistema, cree un fichero de inicio en su directorio denominado .profile, y coloque dentro de él la línea inicio. Cuando se conecte y la shell obtenga control inicial, buscará dicho fichero .profile y correrá la serie de mandatos que se encuentren en él. Volveremos a la Shell en la sección de programación.

III. PREPARACIÓN DOCUMENTAL

Los sistemas UNIX son utilizados extensivamente para la preparación documental. Existen dos programas de formate principales, esto es, programas que producen un texto con márgenes derechos justificados, numeración y titulado de páginas automatizados, división silábica automática, etcétera. nroff está diseñado para producir salida en terminales e impresoras de línea. troff (pronunciado "tiroff") en cambio impulsa una fotocomponedora, una máquina que produce resultados de pre-impresión de muy alta calidad sobre papel fotográfico. Este ducumento ha recibido formato con troff.

Paquetes de formato

La idea básica de nroff y troff es que el texto a recibir formato contenga dentro de él "solicitudes de formato" que indiquen en detalle qué apariencia debe tener el texto con formato. Por ejemplo, puede haber mandatos que especifiquen cuán largas serán las líneas, si debe utilizarse simple o doble espacio, y cuáles serán los títulos a utilizar en cada página.

Como nroff y troff son programas relativamente difíciles de aprender para utilizar de forma efectiva, se ecuentran disponibles varios "paquetes" de solicitudes de formato enlatados para que usted pueda especificar párrafos, títulos seccionales, notas al pie y salida multi-columna, etcétera, con poco esfuerzo y sin tener que aprender nroff y troff. Dichos paquetes requieren un esfuerzo modesto para aprenderlos, pero la recompensa por su utilización es tan alta que representan un tiempo bien invertido.

En esta sección, echaremos un rápido vistazo al paquete "manuscrito", conocido como ms. Las solicitudes de formate típicamente consisten en un punto y dos letras mayúsculas, tal como .TL que se utiliza para introducir un título, o .PP que se utiliza para dar comienzo a un párrafo.

Un documento así mecanografiado tiene el siguiente aspecto:

.TL
titulo documental
.AU
nombre autoral
.SH
encabezado seccional
.PP
párrafo ...
.PP
otro párrafo
.SH
otro encabezado seccional
.PP
etc.

Las líneas que comienzan con un punto son solicitudes de formato. Por ejemplo, .PP solicita comenzar un nuevo párrafo. El significado preciso de .PP depende del dispositivo de salida a utilizar (ya la fotocomponedora o el terminal, por ejemplo) y en qué publicación aparecerá el documento. Por ejemplo, -ms normalmente asume que el párrafo es precedido por un espacio (una línea en nroff, 1/2 línea en troff) y que la primer palabra estará indentada. Estas reglas pueden modificarse si es preciso, pero se dicha modificación se realiza modificando la interpretación de la solicitud de formato .PP, no volviendo a mecanografiando el documento entero.

Para producir realmente el documento en formato estandar utilizando -ms, emplee el mandato:

$ troff -ms ficheros ...

para la fotocomponedora, y

$ nroff -ms ficheros ...

para un terminal. El argumento -ms instruye a troff y a nroff utilizar el paquete "manuscrito" de solicitudes de formato.

Existen varios paquetes similares; consulte al experto local para determinar cuales están en uso en su máquina.

Herramientas de Soporte

Además de los aplicadores básicos de formato, existe un avío de programas de soporte que lo ayudarán con la preparación documental. La lista en los siguientes párrafos está lejos de resultar completa, de manera que debe consultar el manual e interrogar a gente a su alrededor para conocer otras posibilidades.

eqn y neqn le permite integrar fórmulas matemáticas al texto de un documento, en un lenguaje simple de aprender que recuerda la manera en la que uno leería aquello en voz alta. Por ejemplo, la entrada de eqn:

$ sum from i?0 to n x sub i "=" pi over 2

produce esta salida:


El programa tbl provee un servicio análogo destinado a la preparación de material tabular: realiza todas las necesidades computacionales para complicadas alineaciones de las columnas con elementos de ancho variable.

Programar en C

Si está realizando algo sustancial, la única opción de lenguaje de programación reazonable es C: todo en el sistema UNIX está afinado en dicha nota. El sistema en sí está escrito en C, así como la mayoría de los programas que se ejecutan sobre él. Una vez que se acostumbra es un lenguaje simple para utilizar además. C se presenta y describe completamente el "El Lenguaje de Programación C", de B.W. Kerningham y D.M. Ritchie (Prentice-Hall, 1978). Varias secciones del manual describen el sistema de interfases, esto es, como hacer E/S y emplear funciones similares. Debe leer Programando UNIX si desea hacer tareas más complejas.

La mayoría de la entrada y salida en C se administra mejor utilizando la librería estandar de E/S, la cual provee un conjunto de funciones de E/S que existen en forma compatible en la mayoría de las máquinas que tienen compiladores C. En general, es más sabio continuar las interacciones de sistema en un programa que utilice las facilidades provistas por esta biblioteca.

Los programas escritos en C que no dependan en demasía de las funcionalidades especiales de UNIX (tales como los tubos) pueden ser mudados a otras computadoras que cuentan con compiladores de C. La lista de tales máquinas crece diariamente; además del PDP-11 original, actualmente incluye al menos la Honeywell 6000, IBM 370, Interdata 8/32, Data General Nova y Eclipse, HP 2100, Harris /7 VAX 11/780, SEL 86, y Zilog Z80. Las llamadas a la biblioteca estándar de E/S funcionarán en todas estas máquinas.

Existe cierta cantidad de programas de soporte que funcionan con C. lint revisa los programas escritos en C en búsqueda de potenciales problemas de portabilidad, y detecta errores tales como tipos de argumento erróneos y variables no inicializadas.

En caso de aquellos programas más grandes (cualquier cuyo código fuente esté formado por más que un fichero) make permite especificar las dependencias dentro de los ficheros de código fuente y los pasos de procesados requeridos para compilar una nueva versión; luego revisa las ocasiones en las cuales los trozos fueron cambiados desde la última vez, y realiza la mínima cantidad de recompilación posible de modo de crear una versión actualizada consistente.

El depurador adb es útil para hurgar entre los cuerpos inermes de los programas C, pero es bastante difícil el aprender a utilizarlo efectivamente. La herramienta de depurado más efectiva aún es el pensamiento cuidadoso, asociado a declaraciones escritas juiciosamente dispuestas en el código fuente.

El compilador C provee un servicio de instrumentación limitado, de modo que puede buscar donde los programas ocupan su tiempo de procesamiento, y determinar qué partes vale la pena ejercer optimización. Compile las rutinas con la opción -p; luego de la pasada de evaluación utilice prof para imprimir un perfil de ejecución. El mandato time le ofrecerá estadísticas aproximadas de tiempo de ejecución para su programa, pero tenga en cuenta que no son super precisas o reproducibles.

Otros lenguajes.

Si debe hacer uso de Fortran, existen dos posibilidades. Podría considerar Ratfor, que le ofrece el decente manejo de estructuras de control y entrada de forma libre que caracteriza a C, pero le permite imprimir código que aún es portable a otros ambientes. Tenga en cuenta que el Fortran de UNIX tiende a resultar en programas grandes y de relativa lenta ejecución. Además, el software de soporte como adb, prof, etc, resultan virtualmente inútiles con los programas en Fortran. También podría existir un compilador de Fortran 77 para su sistema. Si este es el caso, constituye una alternativa viable a Ratfor, y tiene la ventaja no trivial de que es compatible con C y otros programas relacionados. (El procesador Ratfor y las herramientas de C también pueden ser también utilizados con Fotran 77).

Si sus aplicaciones requieren traducir un lenguaje en un conjunto de acciones o a otro lenguaje, estará - en efectos prácticos - construyendo un compilador, aunque probablemente resulte uno pequeño. En tal caso, debería utilizar el compilador-compilador yacc, que lo ayuda a desarrollar un compilador de forma veloz. El generador de analizador léxico lex hace el mismo trabajo para los lenguajes mas simples que pueden resultar expresados como expresiones regulares. Puede utilizarse por sí mismo, o como un front-end para reconocer entradas de un programa basado en yacc. Tanto yacc como lex requieren alguna sofisticación de uso, pero el esfuerzo inicial de aprenderlos puede valer la pena muchas veces en programas que puedan mluego odificarse muy fácilmente.

La mayoría de los sistemas UNIX también están disponibles en otros lenguajes, tales como Algol 68, APL, Basic, Lisp, Pascal, y Snobol. La utilidad de estos depende grandemente en el ambiente local: si alguien se preocupa del lenguaje y ha trabajado en él, puede tener buenas herramientas. Si no, existen posibilidades marcadas de que sea más problemático utilizarlo que no hacerlo.

(...) sigue apéndice bibliográfico.