Git-bash e cygwin shell possono fare le stesse cose?


13

Su Windows 10, git-bash e cygwin shell possono fare le stesse cose?

Cosa può fare uno ma l'altro no?

Per esempio,

  1. Come shell, possono entrambi funzionare allo stesso modo di bash?
  2. Quali programmi e comandi possono essere eseguiti in uno ma non nell'altro?

    Ad esempio, in git-bash, non posso eseguire alcuni comandi di Windows:

    $  reg add "HKCU\Software\Microsoft\VisualStudio\14.0_Config\MSBuild" /v EnableOutOfProcBuild /t REG_DWORD /d 0 /f
    ERROR: Invalid syntax.
    Type "REG ADD /?" for usage.
    

    Ma in Cygwin, funziona bene

    $  reg add "HKCU\Software\Microsoft\VisualStudio\14.0_Config\MSBuild" /v EnableOutOfProcBuild /t REG_DWORD /d 0 /f
    The operation completed successfully.
    

    inizialmente pensavo che git-bash e cygwin potessero entrambi eseguire programmi in Windows. Quindi perché git-bash non funziona, mentre cygwin può farlo?

Grazie.

Risposte:


10

La differenza è che Cygwin sa come elaborare i cosiddetti percorsi "Win32". A grandi linee, sa che "\" è un separatore di percorso e non un carattere di escape shell come in Bash. L'errore che hai mostrato è che Bash interpreta "\" come carattere di escape. (Modifica: potresti provare a sostituirne uno con due, sfuggendo così alla barra rovesciata, in modo che Bash passi correttamente il comando a reg.exe.)

Detto questo, mentre Cygwin brontola i percorsi di Windows, non gli piace farlo. La documentazione ti avverte di non usarli. Certo, un po 'di back-slide di tanto in tanto non fa male. Ma mentre puoi eseguire programmi Windows in Cygwin, igiene suggerisce che dovresti eseguire programmi Windows nel processore CMD.EXE e UNIX in Cygwin per la tua sanità mentale a lungo termine.


1
È possibile utilizzare cygpath per convertire tra i formati Windows e unix path.
David Post

Grazie. Il percorso nei miei comandi è usato come chiave nella tabella del registro, quindi "\" può essere sostituito con "/"?
Tim

Forse, ma vedi il suggerimento nella risposta (appena modificata).
Impara sempre il

1

C'è molta sovrapposizione tra i due. Ma alla fine sono diverse implementazioni di bash / must in Windows.

Cygwin ha una vasta gamma di software opzionali che è possibile installare, inclusi diversi linguaggi di programmazione, compilatori, vari strumenti di rete e così via. Puoi anche installare X e molte applicazioni X.

Con git bash ottieni quello che ottieni ed è un po 'più difficile installare strumenti aggiuntivi. In realtà ho entrambi sulla mia workstation, perché ci sono cose che non posso fare in Git Bash. Ho avuto un successo molto vario anche chiamando app cygwin dalla finestra di Git Bash.

Inoltre, cygwin è un ambiente posix completo, non solo un interprete bash, quindi puoi spesso compilare codice non distribuito al suo interno, quindi ad esempio se hai trovato la fonte di un simpatico strumento Linux che hai trovato, di solito puoi compilare quello strumento per Cygwin. Non tanto per Git Bash. E come ho accennato in precedenza, anche se lo compili per Cygwin, probabilmente non funzionerà in git bash.

A parte questo, sono per lo più molto simili. È strano vedere che git bash include il cygpathcomando per convertire i percorsi dei file Windows e Posix, perché git bash afaik si basa su MinGW, che è una soluzione distinta da Cygwin.


0

Ho appena trovato una differenza: posso eseguire questo script in Git bash ma non in Cygwin.

for file in *.xml; do
    echo "Processing file: $file"
    sed -r 's:<Autorizado>([0-9]+)</Autorizado>:<Autorizado>00013069</Autorizado>:' -i "$file"
    # ...
done

In Git bash, elabora i miei file xml, ma in Cygwin mi dà un errore:

Processing file: *.xml
sed: cannot read *.xml: No such file or directory

bash --version in Git bash:

GNU bash, version 4.3.42(5)-release (x86_64-pc-msys)

in Cygwin:

GNU bash, versión 4.3.46(7)-release (x86_64-unknown-cygwin)

Questo suggerisce che non esiste alcun file che termina con .xml nella directory corrente nel caso del test cygwin. Dovresti mostrare il risultato di lsnella directory corrente con il comando.
Peter - Ripristina Monica il

Credo che non sia così poiché eseguo lo stesso script in due terminali contemporaneamente. Il file è lì.
WesternGun

2
Esistono due possibilità: (1) Non esiste un file simile, forse perché lo script cygwin viene eseguito in una directory diversa. In tal caso la shell lascia da solo il modello (invece di sostituirlo con la stringa vuota). (Sembra un errore quasi sempre finché non ci si rende conto di poter passare i pattern in findquel modo non quotati.) (2) I nomi dei file sono in realtà * .XML (in maiuscolo) e l'opzione shell nocaseglobè impostata nel git shell making globs insensitive case (che ha un certo senso su Windows).
Peter - Ripristina Monica il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.