2009-02-20 8 views
6

Tengo un script de shell que quiero para ejecutar esta línea:¿Cómo incluir el carácter de tubería en un argumento a un archivo por lotes desde un script bash?

qtvars.bat vsstart "qt.sln" /BUILD "Debug|Win32" 

Esto funciona bien (aunque tuve que modificar qtvars.bat, pero que viene al caso). El problema es que quiero que el comando se ejecute para estar en una variable: EDITAR: Esto tampoco funciona, si lo escribo en bash. Anteriormente, estaba tipeando en cmd.exe, lo cual no era una buena comparación.

command="qtvars.bat" 
args="vsstart" 

$command $args "qt.sln" /BUILD "Debug|Win32" 

¡Ahora se ahoga en la tubería! Me sale este mensaje:

'Win32' is not recognized as an internal or external command, 
operable program or batch file. 

He intentado un montón de formas de escapar de las cotizaciones y/o tubería, todos en vano. Curiosamente, funciona cuando es un ejecutable en lugar de un archivo por lotes, por ejemplo .:

command="devenv.exe" 
args="" 

$command $args "qt.sln" /BUILD "Debug|Win32" 

Gracias por cualquier idea.

Respuesta

7

que sé "escapa" del carácter de la tubería en un archivo por lotes con el carácter ^, así que ...

echo^| Algunos textos aquí^|

Mostraría ...

| Algún texto aquí |

No sé si eso podría ayudarlo en este caso? Tal vez intente anteponer a cada personaje de pipa con un^y ver qué pasa? :-)

3

Este es un caso clásico de doble escape, donde tanto bash como CMD.EXE necesitan instrucciones para ignorar lo especial | (tubería) personaje.

intente lo siguiente:

$command $args "qt.sln" /BUILD '"Debug|Win32"' 

Este será el equivalente de escribir que, en un símbolo del cmd.exe:

qtvars.bat vsstart qt.sln /BUILD "Debug|Win32" 

Utilizando lo anterior, que están obligando esencialmente el paso de la comillas dobles en CMD.EXE (en lugar de bash comérselos). Las comillas simples más externas indican a bash que no interpreten ni toquen de ninguna manera lo que hay dentro de ellos; las comillas dobles internas indican a CMD.EXE que ignore cualquier carácter especial (el conducto en este caso) dentro.

Como alternativa, también puede probar:

$command $args "qt.sln" /BUILD 'Debug\|Win32' 

Este debería ser el equivalente de escribir que, en un símbolo del cmd.exe:

qtvars.bat vsstart qt.sln /BUILD Debug\|Win32 

Nota el uso de individuales comillas (!), que aseguran que bash no interpretará el \ (y, en cambio, lo pasará como está a CMD.EXE.)

+0

Probé esos. Lo hice de nuevo ahora mismo para estar seguro. Producen el mismo error, aunque a veces "Win32" se convierte en "Win32 \" "'en el mensaje de error. – Owen

+0

intente establecer el comando en "cmd.exe qtvars.bat" – vladr

0

¡Interesante! ¿Qué hace escapando el |?

¿Funcionan?

  • echo "depuración | Win32"
  • echo "qt.sln"/BUILD 'depuración | Win32'
+0

¿Quiere decir: ¿Cuál es la intención? Hacer que bash o cmd.exe pasen el | a través de como parte del argumento, en lugar de tratar de procesarlo como sintaxis de tubería. o ¿Cuál es el resultado en mi situación? Nada. – Owen

+0

Quería saber cuál fue el resultado de usar escape? – dirkgently

1

Aquí hay otra solución (solución?) Que he encontrado:

en primer lugar, garantizar una variable de entorno define el carácter de barra vertical, por ejemplo:
set PIPE="|"

después, ejecutar el comando especificando el medio ambiente nombre de la variable definida anteriormente:
"c:\(...)\devenv.com" foo.sln /build Debug%PIPE%Win32

Eso hace el trabajo, incluso si hay múltiples envoltorios entre el llamante y el destinatario. Ahora estoy usando con una muy larga cadena de envoltorios: Python/Linux -> de VirtualBox invitados executeProcess -> cmd/Windows -> devenv.com

(cruz publicado a: How to pass a quoted pipe character to cmd.exe?)

1

El escape de un carácter de canalización en el lenguaje de scripting de Windows se realiza con un símbolo de intercalación (^). Tuve que hacer esto el otro día. Sé que esto es viejo, pero pensé que publicaría lo que encontré en caso de que otros lo descubrieran, como yo.

+0

Gracias! Lo aprecio. De alguna manera no noté que la respuesta anterior decía eso, y la notificación de tu respuesta me trajo aquí. – Owen

Cuestiones relacionadas