<HTML> <HEAD> <TITLE>Cómo pasar de DOS a Linux.: Ficheros y Programas</TITLE> </HEAD> <BODY> <A HREF="Dos-a-Linux-Como-1.html">Anterior</A> <A HREF="Dos-a-Linux-Como-3.html">Siguiente</A> <A HREF="Dos-a-Linux-Como.html#toc2">Indice</A> <HR> <H2><A NAME="s2">2. Ficheros y Programas</A></H2> <H2><A NAME="ss2.1">2.1 Ficheros: Nociones preliminares</A></H2> <P>Linux tiene un sistema de ficheros ---la estructura de directorios y los ficheros que contienen--- muy similar al del DOS. Los ficheros tienen nombres que obedecen unas normas especiales, están guardados en directorios y algunos son ejecutables, y entre éstos , la mayoría tiene opciones en la línea de comandos. Incluso puede utilizar comodines, redirección y tuberías como en DOS. Sólo hay unas pocas diferencias: </P> <P> <UL> <LI>bajo DOS, los nombres de ficheros están en el llamado formato 8.3; por ejemplo <CODE>NOTENOUG.TXT</CODE>. Bajo Linux podemos hacerlo mejor. Si instaló Linux usando un sistema de ficheros tal como <I>ext2</I> o <I>umsdos</I>, puede utilizar nombres más largos (hasta 255 caracteres), y con más de un punto en ellos: por ejemplo, <CODE>Este.es.un.nombre.de.fichero.MUY.largo</CODE>. Dése cuenta de que he utilizado tanto mayúsculas como minúsculas: en efecto... </LI> <LI>Linux es sensible a las mayúsculas y las minúsculas en los nombres de ficheros o comandos. De hecho, <CODE>FICHERO.tar.gz</CODE> , <CODE>Fichero.tar.gz</CODE> y <CODE>fichero.tar.gz</CODE> son tres ficheros distintos. <CODE>ls</CODE> es un comando, <CODE>LS</CODE> sería un error; </LI> <LI>no hay extensiones obligadas como <CODE>.COM</CODE> y <CODE>.EXE</CODE> para los programas, o <CODE>.BAT</CODE> para los ficheros de procesamiento por lotes. Los ficheros ejecutables se marcan con un asterisco. Por ejemplo: <BLOCKQUOTE><CODE> <PRE> $ ls -F cindy.jpg cjpg* Soy_un_directorio/ mi_1er_script* old~ </PRE> </CODE></BLOCKQUOTE> Los ficheros <CODE>cjpg*</CODE> y <CODE>mi_1er_script*</CODE> son "programas" ejecutables. Bajo DOS, las copias de seguridad de los ficheros suelen acabar en <CODE>.BAK</CODE>, mientras que bajo Linux acaban con un gurruño ~. Un fichero cuyo nombre empieza con un punto es considerado como oculto. Ejemplo: el fichero <CODE>.Soy.un.fichero.oculto</CODE> no se mostrará a un comando <CODE>ls</CODE>; </LI> <LI>Las opciones de los programas bajo DOS se obtienen con <CODE>/opción</CODE>. En Linux se obtienen con <CODE>-opción</CODE> o <CODE>--opción</CODE>. Ejemplo: <CODE>dir /s</CODE> se convierte en <CODE>ls -R</CODE>. Fíjese en que muchos programas DOS (como <CODE>PKZIP</CODE> o <CODE>ARJ</CODE>) utilizan opciones de tipo Unix. </LI> </UL> </P> <P>Puede ahora saltar a las Sección <A HREF="#Traduciendo">Traduciendo</A>, pero yo de usted seguiría leyendo.</P> <H2><A NAME="ss2.2">2.2 Enlaces simbólicos</A></H2> <P>Unix tiene un tipo de fichero que no existe bajo DOS: el enlace simbólico. Puede pensar que es un puntero o enlace a un fichero o a un directorio y que puede utilizarse en lugar del fichero o del directorio al que apunta; es similar a los "Accesos Directos" de Windows 95. Ejemplos de enlaces simbólicos son <CODE>/usr/X11</CODE>, que apunta a <CODE>/usr/X11R6</CODE>; <CODE>/dev/modem</CODE>, que apunta a <CODE>/dev/cua0</CODE> o a <CODE>/dev/cua1</CODE>, según donde esté el módem.</P> <P>Para crear un enlace simbólico:</P> <P> <BLOCKQUOTE><CODE> <PRE> $ ln -s <fichero_o_directorio> <nombre_del_enlace> </PRE> </CODE></BLOCKQUOTE> </P> <P>Ejemplo:</P> <P> <BLOCKQUOTE><CODE> <PRE> $ ln -s /usr/doc/g77/DOC g77manual.txt </PRE> </CODE></BLOCKQUOTE> </P> <P>Ahora puede referirse a <CODE>g77manual.txt</CODE> en lugar de <CODE>/usr/doc/g77/DOC</CODE>. </P> <H2><A NAME="Permisos"></A> <A NAME="ss2.3">2.3 Permisos y Propiedades</A></H2> <P>Los ficheros y directorios de DOS tienen los siguientes atributos: <CODE>A</CODE> (fichero), <CODE>H</CODE> (oculto), <CODE>R</CODE> (sólo-lectura), y <CODE>S</CODE> (sistema). Sólo <CODE>H</CODE> y <CODE>R</CODE> tienen sentido bajo Linux: los ficheros ocultos comienzan con un punto, y los de sólo lectura, tienen activado el permiso "<CODE>r</CODE>". </P> <P>Bajo Unix un fichero tiene <I>permisos</I> y un propietario, que pertenece a un grupo. Mire este ejemplo:</P> <P> <BLOCKQUOTE><CODE> <PRE> $ ls -l /bin/ls -rwxr-xr-x 1 root bin 27281 Aug 15 1995 /bin/ls* </PRE> </CODE></BLOCKQUOTE> </P> <P>El primer campo contiene los permisos del fichero <CODE>/bin/ls</CODE>, que pertenece a <CODE>root</CODE>, del grupo <CODE>bin</CODE>. Dejando la información restante a un lado (el libro de Matt esta ahí para ese propósito), sólo recordaré lo que significa <CODE>-rwxr-xr-x</CODE> (de izquierda a derecha):</P> <P><CODE>-</CODE> es el tipo de fichero (<CODE>-</CODE> = fichero normal, <CODE>d</CODE> = directorio, <CODE>l</CODE> = enlace, etc.); <CODE>rwx</CODE> son los permisos del propietario del fichero (leer, escribir, ejecutar); <CODE>r-x</CODE> son los permisos para el grupo del propietario del fichero (leer y ejecutar); (no tocaré el concepto de grupo, puede pasar sin él mientras sea un novato ;-) <CODE>r-x</CODE> son los permisos para todos los demás usuarios (leer, ejecutar).</P> <P>A eso se debe el porqué no puede borrar el fichero <CODE>/bin/ls</CODE> a menos que sea root: no tiene el permiso de escritura para hacer eso. Para cambiar los permisos de un fichero, el comando es: </P> <P> <BLOCKQUOTE><CODE> <PRE> $ chmod <quienXperm> <fichero> </PRE> </CODE></BLOCKQUOTE> </P> <P>donde <CODE>quien</CODE> podría ser:</P> <P> <UL> <LI><CODE>u</CODE> usuario, que es el propietario,</LI> <LI><CODE>g</CODE> (grupo), </LI> <LI><CODE>o</CODE> (otros).</LI> </UL> </P> <P><CODE>X</CODE> puede ser tanto <CODE>+</CODE> como <CODE>-</CODE>, y <CODE>perm</CODE> puede ser:</P> <P> <UL> <LI><CODE>r</CODE> (lectura), </LI> <LI><CODE>w</CODE> (escritura)</LI> <LI><CODE>x</CODE> (ejecución). </LI> </UL> </P> <P>Ejemplos: </P> <P> <BLOCKQUOTE><CODE> <PRE> $ chmod u+x fichero </PRE> </CODE></BLOCKQUOTE> </P> <P>esto habilita el permiso de ejecución para el propietario del fichero. Atajo: <CODE>chmod +x fichero</CODE>. </P> <P> <BLOCKQUOTE><CODE> <PRE> $ chmod go-wx fichero </PRE> </CODE></BLOCKQUOTE> </P> <P>esto quita el permiso de escritura y de ejecución para todo el mundo menos al usuario. </P> <P> <BLOCKQUOTE><CODE> <PRE> $ chmod ugo+rwx fichero </PRE> </CODE></BLOCKQUOTE> </P> <P>esto le da a todo el mundo el permiso de lectura, escritura y ejecución. </P> <P> <BLOCKQUOTE><CODE> <PRE> $ chmod +s fichero </PRE> </CODE></BLOCKQUOTE> </P> <P>esto convierte al fichero en <I>setuid</I> o <I>suid</I>, esto es, un fichero que al ejecutarse lo hace con privilegios de root. </P> <P>Una manera más corta de referirse a los permisos es con números: <CODE>rwxr-xr-x</CODE> puede ser expresado como <CODE>755</CODE> (cada letra corresponde a un bit: <CODE>---</CODE> es <CODE>0</CODE>, <CODE>--x</CODE> es <CODE>1</CODE>, <CODE>-w-</CODE> es <CODE>2</CODE>, <CODE>-wx</CODE> es <CODE>3</CODE>...). Parece difícil, pero con algo de práctica el concepto se domina.</P> <P><CODE>root</CODE>, al ser superusuario, puede cambiar los permisos de los ficheros de todo el mundo. Hay mucha más información acerca de esto: LPM. </P> <H2><A NAME="Traduciendo"></A> <A NAME="ss2.4">2.4 Traduciendo comandos de DOS a Linux</A></H2> <P>A la izquierda, los comandos de DOS; a la derecha, sus correspondientes de Linux. </P> <P> <BLOCKQUOTE><CODE> <PRE> COPY: cp DEL: rm MOVE: mv REN: mv TYPE: more, less, cat </PRE> </CODE></BLOCKQUOTE> </P> <P>Operadores de redirección y de tuberías: </P> <P><CODE>< > >> |</CODE></P> <P>Comodines: <CODE>* ?</CODE></P> <P> <BLOCKQUOTE><CODE> <PRE> nul: /dev/null prn, lpt1: /dev/lp0 o /dev/lp1; lpr </PRE> </CODE></BLOCKQUOTE> </P> <P>EJEMPLOS</P> <P> <BLOCKQUOTE><CODE> <PRE> DOS Linux --------------------------------------------------------------------- C:\GUIDO>copy joe.txt joe.doc $ cp joe.txt joe.doc C:\GUIDO>copy *.* total $ cat * > total C:\GUIDO>copy fractals.doc prn $ lpr fractals.doc C:\GUIDO>del temp $ rm temp C:\GUIDO>del *.bak $ rm *~ C:\GUIDO>move paper.txt tmp\ $ mv paper.txt tmp/ C:\GUIDO>ren paper.txt paper.asc $ mv paper.txt paper.asc C:\GUIDO>print letter.txt $ lpr letter.txt C:\GUIDO>type letter.txt $ more letter.txt C:\GUIDO>type letter.txt $ less letter.txt idem $ more *.txt *.asc idem $ cat section*.txt | less C:\GUIDO>type letter.txt > nul $ cat letter.txt > /dev/null </PRE> </CODE></BLOCKQUOTE> Notas:</P> <P> <UL> <LI><CODE>*</CODE> es más inteligente bajo Linux: <CODE>*</CODE> equivale a todos los ficheros excepto los ocultos; <CODE>.*</CODE> equivale a todos los ficheros ocultos; <CODE>*.*</CODE> equivale sólo a aquellos ficheros que tienen un punto en medio del nombre, seguido de otros caracteres; <CODE>p*r</CODE> equivaldría tanto a <CODE>peor</CODE> como a <CODE>por</CODE>; <CODE>*c*</CODE> equivaldría tanto a <CODE>pecado</CODE> como a <CODE>peca</CODE>. </LI> <LI>cuando se usa <CODE>more</CODE>, pulse espacio para ir leyendo a través del fichero, <CODE>q</CODE> o Ctrl-C para salir. <CODE>less</CODE> es más intuitivo y permite utilizar las teclas del cursor; </LI> <LI>no hay <CODE>UNDELETE</CODE>, así que piénselo dos veces antes de borrar cualquier cosa; </LI> <LI>además de los < > >> del DOS, Linux tiene el operador <CODE>2></CODE> para redirigir los mensajes de error (stderr); más aún, el operador <CODE>2>&1</CODE> redirige stderr a stdout (la salida estándar), mientras que <CODE>1>&2</CODE> redirige stdout a stderr; </LI> <LI>Linux tiene otro comodín: los corchetes <CODE>[]</CODE>. Usar <CODE>[abc]*</CODE> equivale a los ficheros que empiezan por <CODE>a</CODE>, por <CODE>b</CODE> o por <CODE>c</CODE>; <CODE>*[I-N,1,2,3]</CODE> equivale a los ficheros que acaban por <CODE>I, J, K, L, M, N, 1, 2, 3</CODE>; </LI> <LI>no hay un <CODE>RENAME</CODE> como en DOS; esto es, <CODE>mv *.xxx *.yyy</CODE> no funciona; </LI> <LI>use <CODE>cp -i</CODE> y <CODE>mv -i</CODE> para ser avisado cuando un fichero vaya a ser sobreescrito. </LI> </UL> </P> <H2><A NAME="ss2.5">2.5 Ejecución de programas: Multitarea y Sesiones</A></H2> <P>Para ejecutar un programa, escriba su nombre tal y como lo haría bajo DOS. Si el directorio (Sección <A HREF="Dos-a-Linux-Como-3.html#Directorios">Directorios</A>) donde el programa está guardado está incluido en la variable de entorno <CODE>PATH</CODE> (Sección <A HREF="Dos-a-Linux-Como-5.html#Inicializacion">Inicializacion</A>), el programa comenzará a ejecutarse. Excepción: al contrario que bajo DOS, en Linux un programa localizado en el directorio actual no se ejecutará a manos que el directorio actual (simbolizado por ``<CODE>.</CODE>'') esté incluido en el PATH. Para evitarlo, suponiendo que el programa se llame <CODE>prog</CODE>, teclee <CODE>./prog</CODE>.</P> <P>Éste es el aspecto típico de una línea de comandos:</P> <P> <BLOCKQUOTE><CODE> <PRE> $ comando -o1 -o2 ... -on par1 par2 ... parn < input > output </PRE> </CODE></BLOCKQUOTE> </P> <P>donde <CODE>-o1</CODE>, ..., <CODE>-on</CODE> son las opciones del programa, <CODE>par1</CODE>, ..., <CODE>parn</CODE> son los parámetros del programa. Puede encadenar varios comandos en la línea de comandos: </P> <P> <BLOCKQUOTE><CODE> <PRE> $ comando1 ; comando2 ; ... ; comandoN </PRE> </CODE></BLOCKQUOTE> </P> <P>Esto es todo acerca de ejecutar comandos, pero es fácil ir un paso más allá. Una de las principales razones para usar Linux es que es un sistema operativo multitarea ---puede ejecutar varios programas (a partir de ahora, procesos) a la vez---. Puede lanzar procesos en segundo plano (<I>background</I>) y seguir trabajando inmediatamente. Más aún, Linux permite tener varias sesiones abiertas simultáneamente: es como tener muchos ordenadores en los que trabajar a la vez. </P> <P> <UL> <LI>Para cambiar a la sesión 1..6: <BLOCKQUOTE><CODE> <PRE> $ Alt-F1 ... Alt-F6 </PRE> </CODE></BLOCKQUOTE> </LI> <LI>Para comenzar una nueva sesión sin dejar la actual: <BLOCKQUOTE><CODE> <PRE> $ su - <mi_nombre_de_usuario> </PRE> </CODE></BLOCKQUOTE> Ejemplo: <BLOCKQUOTE><CODE> <PRE> $ su - root </PRE> </CODE></BLOCKQUOTE> Esto es útil, por ejemplo, cuando se necesita montar un disco (Sección <A HREF="Dos-a-Linux-Como-4.html#Disquetes">Disquetes</A>): normalmente, sólo <CODE>root</CODE> puede hacer eso. </LI> <LI>Para acabar una sesión: <BLOCKQUOTE><CODE> <PRE> $ exit </PRE> </CODE></BLOCKQUOTE> Si hay trabajos parados (ver más abajo), será avisado. </LI> <LI>Para lanzar un proceso en primer plano: <BLOCKQUOTE><CODE> <PRE> $ nomprog [-opciones] [parametros] [< input] [> output] </PRE> </CODE></BLOCKQUOTE> </LI> <LI>Para lanzar un proceso en segundo plano, añada un <I>ampersand</I>: <CODE>&</CODE>, al final de la línea de comandos: <BLOCKQUOTE><CODE> <PRE> $ nomprog [-opciones] [parametros] [< input] [> output] & [1] 123 </PRE> </CODE></BLOCKQUOTE> el shell o intérprete de comandos identifica el proceso con un número de trabajo (p.e. <F>1</F>; ver más abajo), y con un PID (123 en nuestro ejemplo). </LI> <LI>Para ver cuántos procesos hay: <BLOCKQUOTE><CODE> <PRE> $ ps -a </PRE> </CODE></BLOCKQUOTE> Esto generará una lista de procesos actualmente en ejecución. </LI> <LI>Para matar un proceso: <BLOCKQUOTE><CODE> <PRE> $ kill <PID> </PRE> </CODE></BLOCKQUOTE> Puede necesitar matar un proceso cuando no sabe cómo cerrarlo de la manera correcta... ;-). A veces, un proceso solo podrá ser matado con alguna de las siguientes instrucciones: <BLOCKQUOTE><CODE> <PRE> $ kill -15 <PID> $ kill -9 <PID> </PRE> </CODE></BLOCKQUOTE> </LI> </UL> </P> <P>Además, el intérprete de comandos permite suspender temporalmente (parar) un proceso, mandar un proceso al segundo plano, y traer un proceso del segundo plano al primer plano. En este contexto, los procesos son denominados <I>trabajos</I>. </P> <P> <UL> <LI>Para ver cuántos trabajos hay: <BLOCKQUOTE><CODE> <PRE> $ jobs </PRE> </CODE></BLOCKQUOTE> aquí los trabajos son identificados por su número de trabajo, no por su PID. </LI> <LI>Para parar un proceso ejecutándose en primer plano (no siempre funciona): <BLOCKQUOTE><CODE> <PRE> $ Ctrl-C </PRE> </CODE></BLOCKQUOTE> </LI> <LI>Para suspender un proceso ejecutándose en primer plano: <BLOCKQUOTE><CODE> <PRE> $ Ctrl-Z </PRE> </CODE></BLOCKQUOTE> </LI> <LI>Para mandar un proceso suspendido al segundo plano (convirtiéndolo en trabajo): <BLOCKQUOTE><CODE> <PRE> $ bg <trabajo> </PRE> </CODE></BLOCKQUOTE> </LI> <LI>Para traer un trabajo al primer plano: <BLOCKQUOTE><CODE> <PRE> $ fg <trabajo> </PRE> </CODE></BLOCKQUOTE> </LI> <LI>Para matar un trabajo: <BLOCKQUOTE><CODE> <PRE> $ kill <%trabajo> </PRE> </CODE></BLOCKQUOTE> donde <CODE>trabajo</CODE> puede ser 1, 2, 3; el <CODE>%</CODE> indica que nos referimos a un número de trabajo, y no a un PID. Usando estos comandos puede formatear un disco, comprimir un puñado de ficheros, compilar un programa, y descomprimir un fichero simultáneamente, y todavía tener la línea de comandos a su disposición. Inténtelo con el DOS. Inténtelo con Windows, sólo para ver la diferencia de prestaciones (siempre que no se le cuelgue, claro). </LI> </UL> </P> <H2><A NAME="ss2.6">2.6 Ejecutando Programas en Ordenadores Remotos</A></H2> <P>Para ejecutar un programa en una máquina remota cuya dirección IP es <CODE>remote.bigone.edu</CODE>, teclee: </P> <P> <BLOCKQUOTE><CODE> <PRE> $ slogin remote.bigone.edu -l <login_en_maquina_remota> </PRE> </CODE></BLOCKQUOTE> </P> <P>Tras meter su password, arranque su programa favorito. Obviamente, debe tener una cuenta en la máquina remota. </P> <P>Si tiene X11, puede incluso ejecutar una aplicación X en un ordenador remoto, mostrándolo en su pantalla de X. Supongamos <CODE>remote.bigone.edu</CODE> la máquina X remota y <CODE>local.linux.box</CODE> su máquina Linux. Para ejecutar desde <CODE>local.linux.box</CODE> un programa X que reside en <CODE>remote.bigone.edu</CODE>, haga lo siguiente: </P> <P> <UL> <LI>arranque las X, arranque un xterm o un emulador de terminal equivalente, y entonces teclee: <BLOCKQUOTE><CODE> <PRE> $ xhost +remote.bigone.edu $ slogin remote.bigone.edu -l <login_en_maquina_remota> </PRE> </CODE></BLOCKQUOTE> </LI> <LI>tras meter su password, teclee: <BLOCKQUOTE><CODE> <PRE> remote:$ DISPLAY=local.linux.box:0.0 remote:$ programa & </PRE> </CODE></BLOCKQUOTE> (en vez de <CODE>DISPLAY...</CODE>, puede que tenga que escribir <CODE>setenv DISPLAY local.linux.box:0.0</CODE>. Depende del shell remoto). </LI> </UL> </P> <P>Ahora <CODE>programa</CODE> comenzará en <CODE>remote.bigone.edu</CODE> y se mostrará en su máquina. Aunque mejor no intente esto en una línea ppp.</P> <HR> <A HREF="Dos-a-Linux-Como-1.html">Anterior</A> <A HREF="Dos-a-Linux-Como-3.html">Siguiente</A> <A HREF="Dos-a-Linux-Como.html#toc2">Indice</A> </BODY> </HTML>