2009-02-20 34 views
6

Ho uno script di shell che voglio eseguire questa linea:Come includere il carattere pipe in un argomento in un file batch da uno script bash?

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

questo funziona bene (anche se ho dovuto modificare qtvars.bat, ma non è questo il punto). Il problema è che voglio che il comando si esegua in una variabile: EDIT: Questo non funziona neanche, se lo digito in bash. Precedentemente, stavo scrivendo in cmd.exe, cosa che non ho fatto per un confronto equo.

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

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

Ora soffoca sul tubo! Ottengo questo messaggio:

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

Ho provato un po 'di forme di sfuggire le virgolette e/o tubi, tutti senza alcun risultato. È interessante notare, funziona quando si tratta di un eseguibile, piuttosto che un file batch, ad es .:

command="devenv.exe" 
args="" 

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

Grazie per tutte le idee.

risposta

7

lo so "sfuggi" il carattere pipe in un file batch con il carattere ^, quindi ...

echo^| Qualche testo qui^|

Mostra ...

| Qualche testo qui |

Non so se questo ti potrebbe aiutare in questo caso? Forse prova a prependere ogni carattere di pipe con un^e vedi cosa succede? :-)

3

Questo è un caso classico di doppia escape, in cui sia bash che CMD.EXE devono essere istruiti per ignorare lo speciale | (pipe) personaggio.

provare quanto segue:

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

Questo sarà l'equivalente di voi digitare, al prompt dei CMD.EXE:

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

Utilizzando quanto sopra, si sono essenzialmente forzando il passaggio del doppie virgolette su CMD.EXE (invece di mangiarle via.) Le virgolette singole più esterne indicano a bash di non interpretare o toccare in alcun modo cosa c'è dentro di loro; le doppie virgolette interne indicano a CMD.EXE di ignorare qualsiasi carattere speciale (la pipe in questo caso) all'interno.

In alternativa, si può anche provare:

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

Questo dovrebbe essere l'equivalente di voi digitare, al prompt dei CMD.EXE:

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

Nota l'uso di singoli virgolette (!), che assicurano che bash non interpreti il ​​\ (e, invece, lo passerà così com'è a CMD.EXE).

+0

Provato quelli. Lo ha fatto di nuovo solo adesso per essere sicuro. Risultano nello stesso errore, anche se a volte 'Win32' diventa 'Win32 \ ""' nel messaggio di errore. – Owen

+0

prova a impostare il comando su "cmd.exe qtvars.bat" – vladr

0

Interessante! Cosa fa l'escape del |?

Questi funzionano?

  • echo "Debug | Win32"
  • echo "qt.sln"/BUILD 'Debug | Win32'
+0

Vuoi dire: Qual è l'intento? Per fare in modo che bash o cmd.exe superino | | attraverso come parte dell'argomento, piuttosto che tentare di elaborarlo come sintassi del pipe. o Qual è il risultato nella mia situazione? Niente. – Owen

+0

Volevo sapere qual è stato il risultato dell'utilizzo di escape? – dirkgently

1

Ecco un'altra soluzione (soluzione?) Ho trovato:

primo, assicurare una variabile di ambiente definisce il carattere pipe, ad esempio:
set PIPE="|"

seguito, eseguire il comando specificando il nome della variabile ambiente sopra definiti:
"c:\(...)\devenv.com" foo.sln /build Debug%PIPE%Win32

Questo fa il lavoro anche se ci sono più wrapper tra il chiamante e il chiamato. Ora sto usando con una lunga catena di involucri: Python/Linux -> ospite VirtualBox executeProcess -> Cmd/Windows -> devenv.com

(cross scritto a: How to pass a quoted pipe character to cmd.exe?)

1

L'escape di un personaggio di piping nel linguaggio di script di Windows viene eseguito con un segno di omissione (^). L'ho dovuto fare l'altro giorno. So che questo è vecchio, ma ho pensato di pubblicare ciò che ho trovato nel caso in cui altri si sono imbattuti in questo, come ho fatto io.

+0

Grazie! Lo apprezzo. In qualche modo non ho notato la risposta precedente che lo diceva, e la notifica della tua risposta mi ha riportato qui. – Owen

Problemi correlati