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).
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
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
}
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/'
}
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
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);
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.
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é
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