conversión de ruta msys (o cygpath para msys?)


Necesito pasar /DEF:c:\filepath\myLib.def " opción de línea de comandos desde un script bash al compilador/enlazador de MS. La ruta se genera como parte del proceso de compilación mediante un script bash. Básicamente, el argumento que mi script pasa es:

-DEF:/c/filepath/myLib.def

MSYS path conversion no puede manejarlo correctamente porque no entiende /DEF: parte. Funciona si lo hago

-DEF=/c/filepath/myLib.def

Pero entonces ms tools no entiende este parámetro. En resumen, ¿cuál es la forma correcta de escribir ese parámetro en MSYS ¿bash para que lo convierta en un argumento apropiado?

En cygwin podría usar cygpath, pero no hay equivalente, porque alguien de msys piensa que no es necesario (incluso si hay scripts para cygwin que usan cygpath).

Author: cxw, 2012-08-18

7 answers

Actualización (Ago-2016):

Esta pregunta ya no es relevante, ya que msys2 ahora viene con cygpath en su instalación.

...

Resumiré mi investigación aquí.

El equivalente de cygpath en MSYS es usar este comando:

{ cd /c/some/path && pwd -W; } | sed 's|/|\\|g'

El problema con este enfoque es que requiere ruta existente, por ejemplo, el c:\some\path tiene que ser un directorio existente; sin embargo, real cygpath soporta rutas que no existir.

Por lo tanto, si necesita obtener la ruta a un directorio que no existe, entonces puede recurrir a la conversión sed de la ruta:

{ cd 2>/dev/null /c/some/path && pwd -W ||
  echo /c/some/path | sed 's|^/\([a-z,A-Z]\)/|\1:/|'; } | sed 's|/|\\|g'

La boca llena de barras está ahí para satisfacer las reglas de cita de sed. Por lo tanto, si c:\some\path no existe en su PC, intentará convertir las barras hacia adelante a hacia atrás y reemplazará /c/ con c:\ (o cualquier otra letra de unidad). El único inconveniente de esto es que no funcionará correctamente rutas no existentes que contengan un componente montado, como /bin/does-not-exist o /usr/bin/does-not-exist.

Un enfoque más es usar cygpath de cygwin en MSYS. Parece que cygwin establece la variable de entorno global CYGPATH, es decir, se puede utilizar desde el cmd normal.exe:

%CYGPATH% -w /c/some/path
C:\some\path

O de MSYS:

$CYGPATH -w /c/some/path
C:\some\path

Siempre y cuando establezcas el punto /c a /cygdrive/c en cygwin. Pero este enfoque le imprimirá /usr ubicado en la instalación de cygwin, no en MSYS.

En resumen, creo que msys realmente debería incluir real cygpath en el conjunto predeterminado de herramientas para algunos casos que no son manejados automáticamente por msys command line argument conversion logic

 39
Author: Pavel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-14 15:26:40

Estoy usando esto con msysgit:

winpath() {
    if [ -z "$1" ]; then
        echo "$@"
    else
        if [ -f "$1" ]; then
            local dir=$(dirname "$1")
            local fn=$(basename "$1")
            echo "$(cd "$dir"; echo "$(pwd -W)/$fn")" | sed 's|/|\\|g';
        else
            if [ -d "$1" ]; then
                echo "$(cd "$1"; pwd -W)" | sed 's|/|\\|g';
            else
                echo "$1" | sed 's|^/\(.\)/|\1:\\|g; s|/|\\|g';
            fi
        fi
    fi
}
 6
Author: Dmitri Rubinstein,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-15 14:10:54

Similar a dmitri-rubinstein@ arriba, he limpiado un poco el código y agregado la conversión inversa también.

winpath() {
    if [ ${#} -eq 0 ]; then
        : skip
    elif [ -f "$1" ]; then
        local dirname=$(dirname "$1")
        local basename=$(basename "$1")
        echo "$(cd "$dirname" && pwd -W)/$basename" \
        | sed \
          -e 's|/|\\|g';
    elif [ -d "$1" ]; then
        echo "$(cd "$1" && pwd -W)" \
        | sed \
          -e 's|/|\\|g';
    else
        echo "$1" \
        | sed \
          -e 's|^/\(.\)/|\1:\\|g' \
          -e 's|/|\\|g'
    fi
}

unixpath() {
    echo "$1" \
    | sed -r \
      -e 's/\\/\//g' \
      -e 's/^([^:]+):/\/\1/'
}
 6
Author: TJR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-01 04:42:27

Use pwd -W

O descargar cygpath para msys desde aquí http://mingw.5.n7.nabble.com/enhanced-version-of-cygpath-td28556.html

Y use cygpath -wa

 5
Author: Alex V.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-28 12:36:08

Mi bash foo es débil y no pude obtener expresiones regulares trabajando en bash 3.1, así que hackeé un script perl para ello:

#!/bin/env perl
use strict;

my @r;
foreach my $e (@ARGV) {
 $e=~s/\//\\/g;
 $e=~s/^\\([A-Za-z])\\/\1:\\/;
 push @r, $e;
}

print join(" ", @r);
 3
Author: tanglebones,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-21 19:22:09

MSYS cygpath

Programa

Este programa convierte una ruta de DOS a una ruta de UNIX y viceversa

#!/bin/env perl
# DOS to UNIX path conversion
# © John S. Peterson. License GNU GPL 3.
use strict;
use Getopt::Std;

# usage
if ($#ARGV == -1) {
    print 'Usage: cygpath (-w) NAME...

Convert Unix and Windows format paths

Output type options:

  -w, --windows         print Windows form of NAMEs (C:\WINNT)
';
    exit 0;
}

# option
my %opt;
getopts('w', \%opt);

# convert path
my @r;
foreach my $e (@ARGV) {
    if ($opt{w}) {
        # add drive letter suffix
        $e =~ s,^\/([A-Za-z])\/,\1:\/,;
        $e =~ s,\/,\\,g;

    } else {
        $e =~ s,\\,\/,g;
        # add leading slash
        $e = "/$e";
        # remove drive letter suffix
        $e =~ s,:,,;
    }

    push @r, $e;
}

print join("\n", @r);

Comparado con Cygwin cygpath

La salida de este programa es mejor que la salida de Cygwin cygpath en MSYS porque

  • Cygwin cygpath elimina el inicio de Cygwin de una ruta convertida, p. e.
cygpath "$CYGWIN/usr/local/bin"
/usr/local/bin

Que es un problema porque

  • a veces es útil convertir una ruta de Cygwin de DOS a una ruta de UNIX para el propósito de copiar archivos de Cygwin a MSYS

Este programa no elimina el Cygwin home

cygpath "$CYGWIN/usr/local/bin"
/c/file/program/cygwin/usr/local/bin

Comparado con la conversión automática de rutas MSYS

La conversión manual de rutas tiene un uso en MSYS porque

  • la conversión automática de la ruta es inadecuada

Para f. e.

 2
Author: John Peterson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-13 19:28:59

¿Qué tal este? cmd //c echo <your path>

Puede que no funcione siempre, pero es el más corto que encontré

 1
Author: Candide Guevara Marino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-19 13:49:09