Lo hice y lo entendí

El blog de Vicente Navarro
18 jul

Trabajando con Cygwin

Cualquiera que se sienta confortable trabajando con una shell de Linux podrá comenzar a trabajar desde el primer momento con Cygwin sin absolutamente ninguna dificultad.

Sin embargo, el Cygwin tiene algunas peculiaridades debidas a su naturaleza Windowsera que conviene que conozcamos para poder sacar el máximo rendimiento de este excelente proyecto. Vamos a verlas:

Formas de escribir los paths en Cygwin

El UNIX sólo usa la barra (/) para formar los paths. Windows, en cambio, usa la contrabarra (\) y letras de unidad. Cygwin, en su mundo mixto permite una gran variedad de formas para formar un path, siendo los siguientes ejemplos formas igualmente válidas de acceder a C:\Windows desde Cygwin.

$ ls \c/window

$ ls c:/windows

$ ls c:\\windows

$ ls \c\\windows

$ ls /cygdrive/c/windows

Por cierto, Cygwin, como Windows, es case insensitive para los nombres de ficheros, pero el autocompletado de la línea de comandos no lo es por defecto, por lo que normalmente es mejor cambiarlo:

How can I get bash filename completion to be case insensitive?

Add the following to your ~/.bashrc file:

	shopt -s nocaseglob

and add the following to your ~/.inputrc file:

	set completion-ignore-case on

El sistema de paquetes

Como ya vimos en la entrada Instalar un Cygwin portable en una memoria USB, el Cygwin se vale de una aplicación gráfica (el setup.exe) para añadir, quitar y actualizar paquetes. Es en parte equivalente al dpkg de Debian o al rpm de Red Hat pero en formato gráfico. En realidad, por su naturaleza gráfica es más equivalente a utilidades como Kpackage, Synaptic, GNOME Debian Package Manager, YaST o Anaconda (en realidad estos dos últimos permiten la instalación completa del sistema en las distribuciones que lo incluyen, al fin y al cabo, igual que el setup.exe).

Cygwin Setup

En la línea de comandos tenemos el cygcheck, herramienta equivalente al dpkg o al rpm pero sólo para obtener listados de paquetes instalados (cygcheck -c -d) y sus ficheros (cygcheck -l), así como para verificar que los paquetes están correctamente instalados (cygcheck -c). También podemos buscar a qué paquete pertenece un fichero dado (cygcheck -f) e incluso buscar paquetes (cygcheck -p). Finalmente, podemos hace un chequeo completo de la instalación (cygcheck -s -r).

vnavarro@DARKSTAR ~
$ cygcheck -f /bin/bash
bash-3.2.17-15

vnavarro@DARKSTAR ~
$ cygcheck -l less
/usr/bin/less.exe
/usr/bin/lessecho.exe
/usr/bin/lesskey.exe
/usr/share/man/man1/less.1.gz
/usr/share/man/man1/lesskey.1.gz

vnavarro@DARKSTAR ~
$ cygcheck -c | head
Cygwin Package Information
Package              Version            Status
_update-info-dir     00531-1            OK
alternatives         1.3.29a-1          OK
apache2              2.2.4-1            OK
ash                  20040127-3         OK
base-files           3.7-1              OK
base-passwd          2.2-1              OK
bash                 3.2.17-15          OK
bzip2                1.0.3-2            OK

Bajando a nivel de ficheros, la base de datos de paquetes instalados en el sistema la encontramos en el directorio /etc/setup. Este directorio contiene un fichero .lst.gz por cada paquete del sistema con la lista de ficheros que dicho paquete instala y un grupo de ficheros adicionales con datos de configuración de la última sesión del setup.exe, configuración que se usará como punto de partida en la siguiente ejecución del setup.exe. De estos ficheros, sin duda alguna, el más importante es el installed.db, que contiene la lista de paquetes instalados, incluyendo información sobre la versión.

vnavarro@DARKSTAR /etc/setup
$ ls |grep -v gz
installed.db
last-action
last-cache
last-connection
last-mirror
mirrors-lst
timestamp

/etc/setup en Cygwin

Tal y como veíamos en el artículo de portabilizar el Cygwin cuando eliminábamos las claves del registro y renombrábamos la instalación local de Cygwin, el setup.exe usa la base de datos que paquetes que encuentra en el directorio señalado por el registro:

HKEY_LOCAL_MACHINE\SOFTWARE\Cygnus Solutions\Cygwin\mounts v2\/

Y si dicha clave no existe, el instalador buscará alternativamente en:

C:\cygwin

Aunque no lo he comprobado, es muy posible que en sistemas en los que Windows no esté instalado en C:, el directorio por defecto sea %HOMEDRIVE%\cygwin.

El setup.exe acepta parámetros de línea de comandos. Si ejecutamos setup -h, en el directorio donde estemos se creará un fichero setup.log mostrándonos las opciones disponibles para una instalación desatendida:

2007/07/17 19:45:50 Starting cygwin install, version 2.573.2.2
2007/07/17 19:45:50 Current Directory: C:\Temp\Cygwin
2007/07/17 19:45:50 
Command Line Options:
 -D --download                          Download from internet
 -L --local-install                     Install from local directory
 -s --site                              Download site
 -R --root                              Root installation directory
 -q --quiet-mode                        Unattended setup mode
 -h --help                              print help
 -l --local-package-dir                 Local package directory
 -r --no-replaceonreboot                Disable replacing in-use files on next
                                        reboot.
 -n --no-shortcuts                      Disable creation of desktop and start
                                        menu shortcuts
 -N --no-startmenu                      Disable creation of start menu shortcut
 -d --no-desktop                        Disable creation of desktop shortcut
 -A --disable-buggy-antivirus           Disable known or suspected buggy anti
                                        virus software packages during
                                        execution.
Ending cygwin install

Los paquetes que descarga el setup.exe en el Local Package Directory son unos ficheros .tar.bz2 que contienen los ficheros del paquete junto con unos scrips opcionales para /etc/postinstall y /etc/preremove que se ejecutan en el momento que su nombre indica.

Además, como en las distribuciones de Linux, los paquetes también dejan su documentación en /usr/share/doc/paquete, aunque los README específicos de los paquetes para Cygwin están en /usr/share/doc/Cygwin/paquete.README.

Para finalizar la sección, unos enlaces:

La longitud de los argumentos en la línea de comandos

Mientras que los sistemas UNIX son bastante generosos respecto a la longitud de los argumentos que podemos usar en una línea de comandos, longitud delimitada por el parámetro ARG_MAX (ARG_MAX, the maximum length of arguments for a new process), Windows, en cambio, es muy tacaño (Command prompt (Cmd. exe) command-line string limitation).

En concreto, en un Linux típico, disponemos de 128 KiB para almacenar todos los argumentos y el conjunto de las variables de entorno:

[root@unlinux root]# getconf ARG_MAX
131072

En el cmd de Windows 2000, contamos con 2KiB-1Byte para almacenar los argumentos y la misma cantidad para cada variable de entorno. En Windows XP, la cantidad sube a 8KiB-1Byte.

Para poder evitar esa limitación en Cygwin, los desarrolladores han introducido una forma de introducir argumentos cuando queramos usar las utilidades de Cygwin sin estar dentro de bash, el @pathname, que consiste simplemente en meter los parámetros en un fichero y pasarle al comando únicamente el nombre del fichero precedido de @, con la peculiaridad de que los espacios extras desaparecerán a menos que estén entre comillas:

vnavarro@DARKSTAR ~
$ echo 'Una     linea     "bastante    larga",  no?' > parametros

vnavarro@DARKSTAR ~
$ cat parametros
Una     linea     "bastante    larga",  no?

vnavarro@DARKSTAR ~
$ echo @parametros
@parametros

C:\cygwin\home\vnavarro>c:\cygwin\bin\echo.exe @parametros
Una linea bastante    larga, no?

Los ficheros de dispositivo /dev

El Cygwin emula los dicheros de dispositivo POSIX más comunes. No se puede listar el directorio /dev y que aparezcan, pero todas las aplicaciones de Cygwin son capaces de utilizarlos:

vnavarro@DARKSTAR ~
$ ls /dev
ls: cannot access /dev: No such file or directory

vnavarro@DARKSTAR ~
$ ls /dev/null
/dev/null

vnavarro@DARKSTAR ~
$ echo 'Vete a null!' > /dev/null

Además de los ficheros de dispositivo típicos (tal vez los más famosos sean /dev/null y /dev/zero), el Cygwin proporciona algunos específicos para Windows, el más interesante de los cuales quizás sea el /dev/clipboard que representa el texto almacenado en el portapapeles:

vnavarro@DARKSTAR ~
$ cat /dev/clipboard
Texto copiado

Y además, tenemos ficheros de dispositivo adecuados para un acceso raw a discos y particiones:

/dev/scd0	\device\cdrom0
/dev/scd1	\device\cdrom1
...

/dev/sda	\device\harddisk0\partition0	(primer disco completo)
/dev/sda1	\device\harddisk0\partition1	(primera partición)
...

/dev/sda15	\device\harddisk0\partition15	(segunda partición)

/dev/sdb	\device\harddisk1\partition0
/dev/sdb1	\device\harddisk1\partition1

Por tanto, podríamos, por ejemplo, extraer el MBR del disco fácilmente usando Cygwin:

vnavarro@DARKSTAR ~
$ dd if=/dev/sda of=mbr bs=446 count=1
1+0 records in
1+0 records out
446 bytes (446 B) copied, 0.276 s, 1.6 kB/s

La extensión .exe

Los ejecutables de Cygwin llevan la extensión .exe, como todos los demás en Windows. Sin embargo, podemos trabajar con ellos sin especificar dicha extensión, lo cual puede suponer algún lío… Fijémonos en el siguiente ejemplo: Si copiamos un ejecutable sin especificar extensión, él aútomáticamente la pone:

vnavarro@DARKSTAR /tmp/prueba
$ cp /usr/bin/ls a

vnavarro@DARKSTAR /tmp/prueba
$ ls
a.exe

Para borrar, no podemos omitir la extensión:

vnavarro@DARKSTAR /tmp/prueba
$ rm a
rm: cannot remove `a': No such file or directory

vnavarro@DARKSTAR /tmp/prueba
$ rm a.exe

Si usamos en una parte extensión y en la otra no, la extensión no se añadirá:

vnavarro@DARKSTAR /tmp/prueba
$ cp /usr/bin/ls.exe a

vnavarro@DARKSTAR /tmp/prueba
$ ls
a

Y si tenemos el mismo fichero con extensión y sin extensión, pueden pasar cosas tan curiosas como esta:

vnavarro@DARKSTAR /tmp/prueba
$ ls
a  a.exe  b.exe

vnavarro@DARKSTAR /tmp/prueba
$ ls -i a a.exe
4785074604147613 a  1407374883619739 a.exe

vnavarro@DARKSTAR /tmp/prueba
$ ls -i b b.exe
281474976777118 b  281474976777118 b.exe

El directorio /proc

Como muchos UNIX, Cygwin tiene un sistema de ficheros /proc con información variada del sistema. Un cat /proc/cpuinfo nos devolvería la misma información que veríamos en Linux para el mismo comando, y en /proc/pid/ tenemos información sobre los diferentes procesos de Cygwin:

vnavarro@DARKSTAR /proc
$ ls -F --color
2900/  3456/  5064/  776/  cpuinfo  meminfo     registry/  stat    version
3452/  3476/  5764/  964/  loadavg  partitions  self@      uptime

Pero quizás lo más curioso del /proc de Cygwin es que nos facilita enormemente el acceso al registro de Windows:

vnavarro.DARKSTAR /proc/registry
$ ls /proc/registry/
HKEY_CLASSES_ROOT    HKEY_CURRENT_USER  HKEY_LOCAL_MACHINE     HKEY_USERS
HKEY_CURRENT_CONFIG  HKEY_DYN_DATA      HKEY_PERFORMANCE_DATA

vnavarro.DARKSTAR /proc/registry
$ ls "/proc/registry/HKEY_CURRENT_USER/Software/Cygnus\ Solutions/Cygwin/mounts\ v2/"
/  /usr/bin  /usr/lib  cygdrive flags  cygdrive prefix

vnavarro.DARKSTAR /proc/registry
$ cat "/proc/registry/HKEY_CURRENT_USER/Software/Cygnus\ Solutions/Cygwin/mounts\ v2/cygdrive\ prefix"
/cygdrive

Las utilidades

Las utilidades de Cygwin son: cygcheck, cygpath, dumper, getfacl, kill, mkgroup, mkpasswd, mount, passwd, ps, regtool, setfacl, ssp, strace, umount

Varias de ellas comparten el nombre con su equivalente de Linux: getfacl, mount, passwd, ps, kill, setfacl, strace, umount. Por la propia naturaleza de Windows, estas utilidades han tenido que ser fuertemente adaptadas para este entorno tan diferente. Por ejemplo, los comandos de mount y umount no trabajan sobre dispositivos sino sobre directorios de Windows. ps puede mostrar los procesos de Cygwin y los de Windows (con la opción -W), pero kill sólo puede enviar señales a los procesos de Cygwin.

Respecto a las otras utilidades:

  • cygcheck Comentado anteriormente: Para gestionar los paquetes y el estado de la instalación.
  • cygpath Para convertir paths con formato Windows a paths con formato UNIX y viceversa. También nos proporciona los directorios importantes del sistema.

    vnavarro@DARKSTAR ~
    $ cygpath -D
    /cygdrive/c/Documents and Settings/vnavarro/Desktop
    
    vnavarro@DARKSTAR ~
    $ cygpath -u c:\\Windows
    /cygdrive/c/Windows
    
    vnavarro@DARKSTAR ~
    $ cygpath -w /cygdrive/c
    c:\
  • mkgroup y mkpasswd Nos crean los ficheros /etc/passwd y /etc/group según la configuración de usuarios y grupos de Windows.

Todas ellas tienen página de man para consultar su uso.

Enlaces simbólicos

Cuando hacemos un enlace simbólico en Cygwin, en realidad se crea un acceso directo de Windows (un fichero .lnk) que nos permite usar el enlace también en Windows.

ln -s en Cygwin

Acceso directo Cygwin

La utilidad mkshortcut nos permite generar accesos directos desde la línea de comandos del Cygwin.

En versiones anteriores a Cygwin 1.3.0 se usaba un fichero con una cabecera especial para indicar la existencia de un enlace simbólico: How do symbolic links work?. Aún podemos encontrar algunos ejemplos de tal cosa, por ejemplo, en el awk/gawk:

vnavarro@DARKSTAR /usr/bin
$ ll awk
lrwxrwxrwx 1 vnavarro Users 8 Oct 28 17:05 awk -> gawk.exe*

Si lo abrimos fuera del entorno de Cygwin, veremos dicha cabecera:

C:\cygwin\bin>type awk.exe
!<symlink>gawk.exe

Por supuesto, si intentamos ejecutar tal cosa fuera de Cygwin, nos encontraremos con un error:

Error al ejecutar el awk fuera de Cygwin

Si quisiéramos usar este ejecutable fuera de Cygwin, tendríamos que ejecutar en su lugar el gawk.exe.

Por cierto, Cygwin también soporta hardlinks. Como NTFS soporta los hardlink de forma nativa:

C:\>fsutil hardlink create /?
Usage : fsutil hardlink create <new filename> <existing filename>
   Eg : fsutil hardlink create c:\foo.txt c:\bar.txt

si trabajamos sobre NTFS, los hardlinks de Cygwin son nativos. En FAT, los hardlinks son simples copias que ocupan el mismo sitio que el fichero origen.

¿LF o CR/LF?

Durante la instalación, el setup.exe nos pregunta si queremos trabajar como lo haríamos en cualquier UNIX (binary) o en modo DOS/Windows (text). En el primero de los casos, las líneas de los ficheros creados terminarán en LF y en el segundo de los casos, los ficheros se guardarán con finales de línea CR+LF y serían convertidos a sólo LF en cada lectura.

CR/LF en Cygwin

Esto está explicado en el manual de Cygwin: Text and Binary modes, pero puede resultar algo confuso.

Con el tipo de montaje estándar (binario), los ficheros escritos por utilidades de Cygwin tendrán sus líneas acabadas en LF:

vnavarro@DARKSTAR ~
$ mount
C:\cygwin\bin on /usr/bin type system (binmode)
C:\cygwin\lib on /usr/lib type system (binmode)
C:\cygwin on / type system (binmode)
c: on /cygdrive/c type user (binmode,noumount)

Sin embargo, si montamos un directorio con la opción -t:

man mount

       -b, --binary
              (default)    text files are equivalent to binary files (newline = \n)

       -t, --text
              text files get \r\n line endings
vnavarro@DARKSTAR ~
$ mount -t c:\\temp /tmp/mnt

vnavarro@DARKSTAR ~
$ mount
C:\cygwin\bin on /usr/bin type system (binmode)
C:\cygwin\lib on /usr/lib type system (binmode)
C:\cygwin on / type system (binmode)
c:\temp on /tmp/mnt type system (textmode)
c: on /cygdrive/c type user (binmode,noumount)

vnavarro@DARKSTAR ~
$ echo linea1 > /tmp/fichero_lf

vnavarro@DARKSTAR ~
$ echo linea2 >> /tmp/fichero_lf

vnavarro@DARKSTAR ~
$ cat -vet /tmp/fichero_lf
linea1$
linea2$

vnavarro@DARKSTAR ~
$ cat -vet /cygdrive/c/cygwin/tmp/fichero_lf
linea1$
linea2$

vnavarro@DARKSTAR ~
$ echo linea1 > /tmp/mnt/fichero_crlf

vnavarro@DARKSTAR ~
$ echo linea2 >> /tmp/mnt/fichero_crlf

vnavarro@DARKSTAR ~
$ cat -vet /tmp/mnt/fichero_crlf
linea1$
linea2$

vnavarro@DARKSTAR ~
$ cat -vet /cygdrive/c/Temp/fichero_crlf
linea1^M$
linea2^M$

Podemos ver que mientras que al acceder al fichero a través del directorio montado en modo texto vemos los finales LF, si accedemos por fuera vemos los finales CR+LF.

Referencias imprescindibles

Entradas relacionadas

74 Comentarios a “Trabajando con Cygwin”

  • Iván dice:

    Qué interesante. Tengo cygwin en el ordena del curro porque alguna vez me ha venido muy bien y la verdad es que he aprendido muchas cosas que no conocía y con las que voy a sacarle más partido.

    Gracias por el artículo.

    Saludos, Iván.

  • Iván ¡Muchas gracias a ti por la visita! ;-)

  • marleysoft dice:

    Esta info me viene al pelo, gracias tron!!

  • Cesar dice:

    Me aclaras muchas dudas.
    Gracias por el artículo.

    Saludos.

  • marleysoft y Cesar ¡De nada! ¡Gracias a vosotros por vuestra visita!

  • carakulo dice:

    Gracias por la introduccion, te dejo una errata por si tienes a bien corregirla:

    Cuando dices:
    “Cygwin tiene un sistema de ficheros /proc con información variada del sistema. Un cat /dev/cpuinfo nos devolvería ”

    creo que te refieres a /proc/cpuinfo y no a /dev/cpuinfo.

    Lo dicho, gracias.

  • carakulo ¡Muchísimas gracias por tus comentarios y por informarme de la errata! ¡Ya está arreglada!

  • unratito dice:

    Hola Vicente,

    Precisamente estaba intentando hacer un backup del MBR usando Cygwin, y me volvía loco porque no encontraba “/dev”. Gracias a tu artículo me he orientado. Pero, en vez de…

    $ dd if=/dev/sda1 of=mbr bs=446 count=1

    ¿No debería ser…

    $ dd if=/dev/sda of=mbr bs=446 count=1

    Un saludo.

  • unratito ¡Tienes más razón que un santo! ¡Ya lo he arreglado! ¡Muchas gracias por avisar! :D

  • jacobo dice:

    disculpa yo casi no se nada de cygwin pero tengo una duda y no se si puedas resolverla, pero quisiera saber si de casualidad no se puden instalar programas de linux en windows con este programa como por ejemplo el amarok o k-mess, es que pues me gustan mucho y pues no estaria de mas poder instalarlos en mi pc, ahy te dejo mi correo por si puedes constarme esta pregunta.

  • jacobo Cygwin no ejecuta directamente programas de Linux en Windows. Facilita muchísimo que los programas de Linux se puedan compilar en Windows con las herramientas de Cygwin, pero si nadie lo ha hecho, no estarán esos programas fácilmente disponibles. Puesto que ambos son preogramas para KDE, puedes intentar informate sobre si alguien lo ha hecho ya en la página del KDE para Cygwin.

  • Nuelma dice:

    Saludos, tengo el siguiente dilema, estoy recien comensando a utilizar cygwin. en estos momento ejecuto un bash awk que busca un archivo con datos y genera otros archivos fraccionados, como esta tarea se realiza repetidas veces con distintos archivos resulta tedioso editar el bash y agregar o liminar nombres de archivo, o alargar el vector con los datos, etc. mi idea es automatizar un poco esto pretendo crear un formulario en visual basic y deasde alli llamar al cigwin crear el bash awk y ejecutarlo, pero llego hasta ejecutar el cigwin y no le puedo enviar parametros para que este los ejecute, ya sea “bash bashquecortaarchivos.bat”. ¿existe alguna forma de enviar parametros al cigwin con otro bash que se ejecute desde visual?, o alguna otra forma de realizar lo que pretendo, habia pensado en llamar al bash.exe de la carpeta bin y a este enviarle los parametros, pero tampoco me resulto.

    agradeceria mucho de sus consejos.

  • Nuelma Si yo me creo un script en c:\script.sh y ejecuto (desde el CMD normal de Windows) esto:

    c:\cygwin\bin\bash c:/script.sh

    me funciona sin problemas.

  • Nuelma dice:

    muchas gracias por responder, probe lo que indicas con el cmd pero no ejecuta el script en si, solo aparece el codigo con uin mensaje de abort.

    este es el codigo que ocupo para seccionar los archivos

    awk '{
    code[1]=1
    code[2]=2
    code[3]=3
    code[4]=4
    code[5]=5;
    for(indice in code){
          if (($2 == code[indice]) && (NR>3))    # columna 2 contiene la id de corte y NR: numero de registros sea > 1 
                 print > "archsal"code[indice]".txt"
     }
    }'  archent.txt

    lo guardo como cortar.bat y lo ejecuto de la siguiente forma en el cygwin.

    $ bash cortar.bat

    mi idea era crear el archivo de la misma forma solo cambiar el vector desde vb, despues ejecutar el cygwin. si tienes alguna idea sera bienvenida, de todos modos muchas gracias

  • Nuelma He actualizado un poco la sección de enlaces simbólicos. Por favor, échale un vistazo. Como verás allí, en Cywin, awk es un enlace simbólico a gawk. Por ello no puedes usarlo fuera del entorno de Cygwin, pero sí que puedes usar el gawk, que funciona sin problemas:

    C:\>echo prueba > prueba.txt
    
    C:\>c:\cygwin\bin\gawk '{ print $1 }' c:\prueba.txt
    prueba

    Por otra parte, si decides poner lo mismo en un script para ejecutarlo fuera del entorno de Cygwin, tienes que acordarte de poner los PATH completos, porque el bash no habrá ejecutado el /etc/profile ni el .bashrc para poner las variables de entorno bien:

    C:\>c:\cygwin\bin\bash
    bash-3.2$ awk
    bash: awk: command not found

    Y finalmente, he descubierto que con este script:

    #!/bin/bash
    /usr/bin/gawk '{ print $1 }' c:/prueba.txt

    devuelve un extraño error:

    C:\>c:\cygwin\bin\bash c:\script.sh
    ' for reading (No such file or directory)e `c:/prueba.txt

    que es una deformación del error estándar para informar de que no se ha encontrado el fichero:

    C:\>c:\cygwin\bin\gawk '{ print $1 }' noexiste.txt
    gawk: cmd. line:1: fatal: cannot open file `noexiste.txt' for reading (No such file or directory)

    Sin embargo, esta otra versión en la que usamos un empipamiento y no especificamos el fichero:

    #!/bin/bash
    /bin/cat c:/prueba.txt | /bin/gawk '{ print $1 }'

    sí funciona:

    C:\>c:\cygwin\bin\bash c:\script.sh
    prueba

    Debe de ser un bug, porque en otros UNIX, lo anterior sí funciona.

    Yo creo que con todos estos temas te podrían estaban afectando. Tras considerarlos, deberías de poder ejecutar sin problemas tu script.

  • Nuelma dice:

    por fin lo logre haciendo algunos arreglos al archivo del scrip. llamo al gawk y usando “-f” indico el path del archivo que tiene el script(cut.txt), luego el path del archivo con los datos(archivodatos.txt), como sigue(tengo instalado el cygwin en el d:)

    c:\> d:\cygwin\bin\gawk -f c:\cut.txt c:\datos\archivodatos.txt
    
    el archivo con el escrip queda como sigue
    {
    code[1]=1
    code[2]=2
    code[3]=3
    code[4]=4
    code[5]=5;
    for(indice in code){
          if (($2 == code[indice]) && (NR>3))
                 print > "sal"code[indice]".txt"
     }
    }

    la diferencia con el primero es que quito las comillas simples y el awk inicial. ahora creo un bat y listo funciona. muchas gracias por el tiempo prestado, los concejos, articulos, …todo. :)

  • Nuelma Me alegro de que te haya funcionado :-)

  • Constantino dice:

    Buenas tardes

    Estoy buscando comando basicos de cygwin bash-3.2 tengo Windows Vista??

    Saludos

  • Constantino No entiendo en absoluto qué es lo que necesitas. Si lo que quieres es instalar Cygwin en Windows Vista, en principio no deberías de tener ningún problema.

  • Juan Pablo dice:

    Hola Vicente:

    Realmente Cygwin es una aplicación espectacular.

    Por circunstancias algo extrañas, estoy tratando de hacer funcionar un paquete open source que se llama iMOOSE, y cuya instalación es bastante larga. Desgraciadamente estoy topando con problemas en la compilación del mismo, y que no estoy pudiendo descifrar (la cosa de por sí es complicada ya que tengo casi los mismos problemas en Ubuntu)

    Lo que quería preguntarte es si tienes algún ejemplo o referencia a un ejemplo para compilar una aplicación (compleja) en Cygwin? Con el fin de seguir los pasos en detalle y entender mejor el funcionamiento. (Este programa sigue el proceso clásico de *ix con ./configure y luego make all y luego make install.

    Gracias por adelantado.
    Juan Pablo

  • @Juan Pablo Me temo que no puedo darte consejos sobre lo que dices. Yo las pocas cosas que he intentado compilar en Cygwin, en su mayoría cosas sencillas, me han funcionado sin problemas.

  • Juan Pablo dice:

    Hola Vicente:

    Muchas gracias, haré la prueba inicial con algunas cosas simples (si puedes pasarme referencia a ésas te agradeceré) y luego trataremos el más complejo que es este iMOOSE
    Un abrazo,
    Juan Pablo

  • xavier dice:

    Hola,

    yo tengo CYGWIN desde hace un par de años instalado en el PC del trabajo.
    Siempre que necesito analizar ficheros de log, parsear y demás acabo pasando del ‘shell de windows’ y lo empleo.
    ahora estoy buscando a ver si tiene alguna utilidad para formatear …

    Saludos
    Xavier

  • @xavier ¿El comando format de Windows que se puede usar en Cygwin no te sirve?

  • JO dice:

    Hola!

    Me parece una info muy interesante. Muchas gracias, me guardo la página y le echaré un vistazo.

    JO

  • alien dice:

    Super Coco
    Recién me voy a iniciar con Cygwin y el material que pusiste me vendrá muy bien.
    Ahora te hago una pregunta:
    Resulta que tengo que desarrollar un programa en C (en modo consola estándar) para una empresa y yo uso en casa Windows XP. Quería saber si con Cygwin puedo tranquilamente desarrrollar esa aplicación en C, compilarlo en Cygwin, y que luego el mismo se ejecute sin problemas en cualquier otro Linux como ser Debian, Ubuntu, etc.

    Saludos

  • @alien Sí, podrías usar Cygwin para hacer el desarrollo, pero el binario resultante no funcionaría en Linux directamente.

    El código fuente te servirá sin cambios en Linux en la mayoría de casos pero en otros puede que no, ya que hay factores como las librerías disponibles o sus versiones que afectan. Por tanto, puede ser que puedas reutilizar el código fuente recompilándolo en Linux, pero no es seguro que funcione 100% sin problemas.

  • alien dice:

    Gracias Super Coco. Yo pensaba que Cygwin me producía los binarios -y todo lo demás- del programa C para ser ejecutado en un Linux sin problemas.

    Entonces tendría que utilizar un Linux Live-CD no?
    Supongo que con él sí puedo hacer mi aplicación C (ya que tengo entendido que por ejemplo Ubuntu Live o Knnopix traen un compilador C incluido) y luego que la gente de la empresa lo ejecute con su Linux; eso es posible?

    Lamentablemente por ahora no podré instalar Linux en mi PC porque en este momento estoy terminando con una aplicación hecha en C bajo Windows XP para otra gente.

    Saludos

  • @alien Sí, con un Live-CD podrías desarrollar el programa, pero como cargan de la unidad óptica no van muy ligeros. La mejor opción sería instalar Linux en el disco duro. No hay ningún problema en, si tienes un poco de espacio en el disco duro, reparticionar y dejarle un poco de hueco junto a Windows. Por otra parte, asegúrate de tener más o menos la mismas versiones de librerías que tu cliente o tal vez el binario no funcione directamente.

  • alien dice:

    Gracias amigo, seguiré tus consejos.

    Un saludo

  • Eduardo dice:

    tengo un programa que tiene que ver con sockets, pero existe una libreria que no tiene y la quiero agregar, y no se como, alguien me puede ayudar, el programa en linux no me carca error, pero cuando lo correo me marca unos mensajes (agrego que la libreria que no puedo agregar, la agregue a una libreria, pero no se si es la correcta), pd. son nuevo usando el cygwin

  • @Eduardo Me temo que no te puedo ayudar con tu problema. Lo siento.

  • Andres dice:

    Hola!!!
    Primera vez que me estoy interiorizando en LINUX, dado que me gustaria aprender a utilizar su ambiente, instale el Sygwin, pero ahora no se que hacer. Con suerte se algunos comandos que he leido por ahi, pero nada mas, aca hablan de todo y yo quedo marcando ocupado.

    Quisiera me enviaras o dieras link, de que puedo hacer con esta herramienta, que muchos dicen que es muy buena, comandos y todo eso, me volveria loco buscando en internet informacion de este programa, pero si no entiendo para que es, es dificil, poder inteniorizarce mas en esto.

    Otra cosa este programa tiene alguna interfaz grafica???
    Cualquier ayuda me agradeceria me la inviaras o informaras mediante el correo o el foro.

    De antemano muchas gracias.

    PD. Como puedo conseguirme un cd de lunix para instalar, y puedo instalar LINUX si ya tengo windows xp instalado en mi PC??

  • Javier dice:

    Hola Muchachos:

    tengo un gran problema con el Cygwin trabajo muchas ventanas al tiempo de esta interfaz tan buena pero me pierdo por el gran numero de ventanas ya q en cada una de ellas dejo un proceso distinto y lo unico q me aparece en la parte superior de la ventana es ” ~ ” quisiera saber si hay alguna forma de cambiar esto espero su respuesta y Gracias.

  • @Javier Igual el Terminator, descrito en la entrada “Terminales para Cygwin. Notas sobre Terminfo y Termcap.” te sirve para lo que comentas.

  • Beatriz dice:

    Hola,
    Me he instalado el cygwin con windows vista y no me funciona bien. No me reconoce los comandos, ni siquiera startx, y no puedo trabajar. Si pongo ls, me sale bash.exe. Me dijeron que lo instalara con el modo de compatibilidad, y lo he hecho, pero sigue sin funcionar.
    Intento desinstalarmelo, pero no me deja eliminarlo de c:/, me lo recicla. Tampoco aparece en la lista de programas en el panel de controol, ¿qué debo hacer para desinstalarlo y volverlo a instalar?
    Gracias

  • @Beatriz No he usado nunca ni Vista ni Cygwin sobre Vista, de modo que no te puedo ayudar. Lo siento.

  • Gurru dice:

    Hola. Gracias por toda la ayuda que dais.
    Yo acabo de descubrir el Cygwin. Mi problema es que tengo un código en C desarrollado para Linux (con directorios de Linux, librerías, y que se ejecuta en shell) pero tengo que utilizarlo en windows para comparar resultados con software windows. Mi pregunta es si con Cygwin los datos creados por el código C puedo después utilizarlos con el software windows o si utilizarán tambien el sitema de archivos de Linux y no serán compatibles. Es decir, ¿me vale el cygwin para reutilizar el código que tengo en Linux o tengo que modificar el código C y compilarlo en Windows ya todo? Muchas gracias por adelantado.

  • @Gurru Dependiendo de qué hagas, podrías usar Cygwin para reutilizar el código de Linux pero en función de las librerías que haya o no haya disponibles en Cygwin, puedes encontrarte con que no sea posible.

  • Damon83 dice:

    Hola, acabo de instalar cygwin y no tnego muy claro como va. Tengo una aplicacion programada en c con sus cabeceras. La compilacion del programa se hace ocmo en linux, es decir, >gcc arxivo.c -o arxivo.exe? esque lo he compilado de esa forma y me ha dado mil errores…”error de decdificacion” no se si esque las cabeceras han de ir en alguna carpeta especifica. Gracias y slaudos

  • @Damon83 En principio se compila igual, sí. Pero ni la versión de gcc es la misma ni la de las librerías y ni siquiera las librerías instaladas son las mismas, así que puede haber muchas cosas que no permitan que el código fuente de Linux se compile en Cygwin sin problemas. Algunos casos necesitarán trabajo adicional para adaptar el código.

  • sofia dice:

    Hola,

    Me gustaría saber si se puede instalar BlueZ con Cygwin. Lo intenté hacer pero me da un error:
    Bluetooth library is required.
    Pero no sé que librería quiere decir. Alguien sabe cómo se hace.

    Muchas gracias.

  • @sofia Seguro que no. Ese tipo de librerías necesitan interfaces de bajo nivel que en Cygwin no existen.

  • cheillo dice:

    disculpen la ignorancia pero como obtengo permisos de administrador al iniciar el cygwin y que me cambie $ por # ??? … gracias por adelantado …

  • @cheillo En Cygwin siempre trabajas con el mismo usuario que el que estás usando en Windows a menos que lo ejecutes como administrador.

  • Jesus F. dice:

    Hola, soy nuevo en el manejo fuerte de cygwin( solo he hecho pruebas de comandos linux). Lo que necesito es saber como tomar las variables de entorno de windows para usarlas en un shell script que se ejecutara con cygwin(esto para pruebas bajo windows, luego se pasara a unix). Agradecido de ante mano.

  • @Jesus F. En Cygwin tienes todas las variables de entorno de Windows a tu disposición. Ejecuta set o env y lo verás.

  • Jesus F. dice:

    Buenos dias, gracias por la respuesta. Intente lo que me dices de la siguente manera:

    - echo “Variables de entorno de Windows…”
    - env $Path

    pero no consigo que me muestre la cadena en la consola. Tambien intente con

    - echo “Variables de entorno de Windows…”
    - echo $Path

    y nada. Si me pudieras mostrar un ejemplo sencillo de como hacerlo, te estaria muy agradecido. Saludoss!!!!…..

  • @Jesus F. No entiendo lo que quieres hacer con “env $Path“. Si quieres sacar el PATH, sólo tienes que ejecutar “echo $PATH“. Si quieres sacar una variable en concreto, puedes hacer “env | grep VARIABLE“.

  • Jesus F. dice:

    Gracias por tu respuesta me ayudo a entender mas el asunto de las variables de entrono, pero tengo otro problemita y es que cuando intento ejecutar un archivo .sh me lanza errores que en unix no aparecen. Te envio un ejemplo del codigo que uso y el error:

    ——-Codigo————
    #!/bin/bash
    cd /home/farma

    ——-Error————–
    New User@pc003 /cygdrive/c
    $ sh FarmaOracleSH.sh
    : No such file or directoryd: /home/farma
    FarmaOracleSH.sh: line 3: $’\r’: command not found
    FarmaOracleSH.sh: line 4: $’\r’: command not found

    El archivo FarmaOracleSH.sh esta en “/cygdrive/c” y la ruta a la que quiero cambiar es a “/home/farma”.
    Que puede ser??? De verdad que no entiendo.

    Gracias por tus respuestas!!!!….

  • @Jesus F. Fíjate en que se queja de que en las líneas 3 y 4 (que seguro que son líneas vacías) hay un r. Eso ocurre porque estás creando el script con un programa de Windows (p.e. el bloc de notas) por lo que las líneas tienen fin de línea de Windows y no de UNX. En la sección ¿LF o CR/LF? hablo un poco de ese tema.

    Escribe el script con vi dentro de Cygwin o al menos conviértelo con el comando dos2unix antes de ejecutarlo.

  • Jesus F. dice:

    Gracias!!!! Te debo una hermano!!! Yo estoy usando el Notepad++ y entre sus opciones esta la de crear los archivos con el formato de unix(aparte de que colorea las palabras reservadas de muchos lenguajes de programacion, es mas comodo y es GPL). Si tengo otra duda o consigo algo interesante lo publicare. Saludos!!!!!

  • @Jesus F. Me alegro de que te haya servido mi consejo. Yo también uso el Notepad++ en Windows :D

  • Jesus F. dice:

    Buenas tardes. Tengo una inquietud(quizas sea pequeño y trivial pero tengo que resolverla :) ): Tengo este codigo
    #!/bin/bash
    cd /home/farma/prueba
    for POLL in *.*
    do
    if [ ! -s $POLL ] # Remove empty files
    then
    rm $POLL
    echo “Remove empty files”
    fi
    done
    exit

    y en la instrucion “if [ ! -s $POLL ] # Remove empty files” no se que significa el “-s”. Estuve buscando el la web y solo consigo ejemplos de otras opciones como -f, -d, -x, -r, etc.
    Gracias por sus respuestas!!!!

  • @Jesus F. Si haces un “man bash” en Cygwin verás que:

    -s file

    True if file exists and has a size greater than zero.

  • Jesus F. dice:

    Gracias hermano. De verdad que si esta ayuda estaria todavia dadome cabezasos!!!! :D

  • Pepe dice:

    Tengo windows vista e instale cygwin, pero no ejecuta correctamente, incluso ni ls
    funciona.

    Alguien sabe que puede pasar

  • MaKe dice:

    Buenas Super_Coco. Muchas gracias por la info es super interesante. Yo estoy iniciandome en esto porque debo de administrar una aplicacion bajo Solaris y de momento para empezar a soltarme creo que me puede valer… pero… kitando ls crear y petar directorios y archivos… jejeje no se que mas puedo hacer?
    Muchisimas gracias por currarte esto, nos ayuda a los que somos un poko tontines jajajjaa o que se tan iniciando!!

    Saludos!!

  • TongaX dice:

    Super Coco, estoy haciendo un experimento con una aplicacion que cuando instala, agrega servicios de windows… el tema es que cuando realize updates, algunos servicios me funcionan y otros no, pero el tema es el porque… yo instale todo dentro de la sesion Administrador de mi Wind 2003 Serv. y por lo que veo, es que cuando instalas algo haciendo doble click al setup.exe, te registra todos los archivos con el owner Administrador… pero cuando cargar variables de ambiente y demas desde linea de comando y haces las cosas desde linea de comando, me parece que hace sus operaciones con los archivos, pero sin owner… puede probable algo de lo que te estoy comentando?

    Saludos, TongaX

  • @TongaX Me temo que no consigo seguirte. ¿Qué relación tiene lo que comentas con el Cygwin?

  • Victor dice:

    Hola a todos.

    Esta forma de instalar CygWin, me parece muy util.

    Por otro lado requiero de ayuda, espero me puedan ayudar. El problema que tengo es el siguiente:

    Cuando me inicie con CygWin, hace un par de años, lo instale en mi maquina que tenia windows Milenio y trabaje por mucho tiempo así sin ningun problema.
    Después cambie el sistema a windows XP y al tratar de instalar el CygWin el programade setup.exe, siempre manda un mensaje que windows tiene algun problema con el “bash.exe”. Debido a esto, la instalacion nunca se concluye, el setup se queda conjelado.

    En resumen no he podido instalar CygWin sobre WindowsXP ! ! ! !

    Alguien podria ayudarme en este problema o indicarme donde encontrar informacion al respecto.

    Muchas gracias. Saludos.

  • @Victor Pues no sabría decirte. Yo he instalado Cygwin en muchos Windows XP y sin ningún problema. Eso sí, asegúrate de estar instalando una versión actual.

  • Victor dice:

    Gracias por el comentario.

    La version que he tratado de instalar seguramente es actual, pues lo hago desde internet.

    Por otro lado no creo que sea problema de mi maquina pues he tenido el mismo problema en dos maquinas distintas, una de escrotio y otra una portable.

    Posiblemente sea una eleccion erronea de las pociones de instalacion. ¿donde podria encontrar informacion detallada sobre las opciones de instalacion? (he encontrado algunos descripciones de como se instala pero son muy escuetas)

    Gracias por la informacion.

  • @Victor Hasta donde yo he probado, una instalación en la que eliges todo por defecto me ha funcionado multitud de veces sin problemas. Tal vez sea un programa común que interfiere en ambas de tus máquinas. Yo probaría en un Windows XP recién instalado. Puesto que el Cygwin es un programa muy simple, no debería de dar problemas con ningún software.

  • Victor dice:

    Que tal Super coco.

    Tome tu ultimo consejo, y ya comprobe que hay algun proceso de windows que debe estar interfiriendo con el setup de CygWin.

    De hecho pude instalar Cygwin iniciando windows desde el modo de fallos, y solo asi el setup.exe no tuvo ningun contratiempo, todo se instalo limpiamente. Pero de nuevo al reiniciar windows en modo normal, y ejecutar Cygwin no se ejecuta y presenta problemas.

    Ya desinstale el antivirus y el cortafuegos, sin ningun exito. No se que proceso podria estar interfiriendo.

    ¿Tienes alguna idea de que tipo de proceso puede interferir con cygwin??

    Gracias y hasta la proxima.

  • @Victor Pues ni idea… lo siento.

  • pedro dice:

    Saludos super coco:

    hola que tal acabo de instalar cygwin incluyendo el paquete devel pero entonces porque no puedo
    compilar archivos escrito en “C”? segun tutoriales solo basta con agregar a la instalcion el paquete devel
    o me equivoco? , a una cosa mas porfa debo instalar algun paquete mas para trabajar con datos introducidos por el teclado?
    bueno gracias por su ayuda bye…..

  • @pedro Para compilar programas en C tendrás que instalar paquetes como el gcc, el make, etc.. Si has instalado todos los paquetes de la categoría de “devel”, ya deberías de tener estas utilidades instaladas y deberías de poder compilar sin problemas.

  • nishep dice:

    hola!
    tengo un problema sobre como hacer q se ejecute un programa en cygwin, ya pude ejecutar cygwin y como necesito start x lo abro y busco ahi el archivo q deseo ejecutar por medio de ls c:/cygwin/usr y ahi lo encuetro. pero no puedo hacer que este se ejecute ya probe con la orden cd para colocarme en ese archivo, tambien con dir y me sale “not a directory” y cuando pongo el archivo q deseo q se ejecute osm.exe me sale “mail cd osm.exe” podrian ayudarmepara poder ejecutarlo? por favor.

  • MURCI3LAGO dice:

    Hola: Estoy enpezando con Cygwin y debo decir que es la mejor información en castellano
    que encontré.-
    voy a utilizar todos los consejos que das y despues les comento como me fué…

    Desde ya estoy ETERNAMENTE agradecido!!!

  • jotaeme747 dice:

    SuperCOCO, me saco el sombrero ante tu capacidad y dominio del tema. Y aprovechando estas lineas, te hare una pregunta, ya que soy un cincuenton que conocio unix y vi antes que DOS y Notepad.
    Donde yo estaba trabajando, reemplazaban el comando “ls -l” por “ll”, y asi agunos mas.
    ¿puedes indicarme que genero y donde lo coloco para lograr lo mismo?
    Un respetuoso abrazo……jotaeme747

  • @jotaeme747 ¡Bienvenida sea siempre la experiencia! :-)

    Sobre lo que preguntas, edita el .bashrc de tu $HOME y añade:

    alias ll='ls -la'
  • alberto zamorano dice:

    mi problema es que tengo un cygwin montado en un servidor windows 2003
    y no se como modificar el home de un usuario para que cuando se conecten con el puty el home en vez de ser c:xxxx sea d:xxxx

Tema LHYLE09, creado por Vicente Navarro