Bisakah shell git-bash dan cygwin melakukan hal yang sama?

12

Pada Windows 10, dapatkah git-bash dan cygwin shell melakukan hal yang sama?

Apa yang bisa dilakukan tetapi yang lain tidak?

Sebagai contoh,

  1. Sebagai shell, dapatkah keduanya bekerja sama dengan bash?
  2. Program dan perintah apa yang dapat dijalankan di satu tetapi tidak di yang lain?

    Sebagai contoh, di git-bash, saya tidak dapat menjalankan beberapa perintah 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.
    

    Namun dalam Cygwin, ini berjalan dengan baik

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

    awalnya saya berpikir bahwa git-bash dan cygwin dapat menjalankan program di Windows. Jadi mengapa git-bash tidak berfungsi, sementara cygwin bisa?

Terima kasih.

Tim
sumber

Jawaban:

8

Perbedaannya adalah bahwa Cygwin tahu cara memproses apa yang disebut pathnames "Win32". Secara longgar, ia tahu bahwa "\" adalah pemisah pathname dan bukan karakter shell escape seperti di Bash. Kesalahan yang Anda tunjukkan adalah Bash menafsirkan "\" sebagai karakter pelarian. (Sunting: Anda dapat mencoba mengganti satu \ dengan dua, sehingga lolos dari garis miring terbalik, sehingga Bash melewati perintah hingga ke reg.exe dengan benar.)

Karena itu, sementara Cygwin mencari-cari nama path Windows, ia tidak suka melakukannya. The dokumentasi memperingatkan Anda dari menggunakan mereka. Tentu saja, sedikit meluncur ke belakang sekarang dan kemudian tidak sakit. Tetapi sementara Anda dapat menjalankan program Windows di Cygwin, kebersihan menyarankan Anda harus menjalankan program Windows di prosesor CMD.EXE dan yang UNIX di Cygwin untuk kewarasan jangka panjang Anda.

Selalu belajar
sumber
1
Anda dapat menggunakan cygpath untuk mengkonversi antara windows dan format unix path.
DavidPostill
Terima kasih. Pathname dalam perintah saya digunakan sebagai kunci dalam tabel registri, jadi bisakah "\" di dalamnya diganti dengan "/"?
Tim
Mungkin, tetapi lihat saran di jawaban (yang baru diedit).
AlwaysLearning
0

Saya baru saja menemukan perbedaan: Saya dapat menjalankan skrip ini di Git bash tetapi tidak di Cygwin.

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

Di Git bash, itu memproses file xml saya, tetapi di Cygwin, itu memberi saya kesalahan:

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

bash --version di Git bash:

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

dalam Cygwin:

GNU bash, versión 4.3.46(7)-release (x86_64-unknown-cygwin)
WesternGun
sumber
Ini hanya menunjukkan bahwa tidak ada file yang diakhiri dengan .xml di direktori saat ini, kasus dari uji cygwin. Anda harus menunjukkan hasil lsdalam direktori saat ini dengan perintah.
Peter A. Schneider
Saya percaya ini tidak terjadi karena saya menjalankan skrip yang sama di dua terminal pada saat yang sama. File itu ada di sana.
WesternGun
2
Ada dua kemungkinan: (1) Tidak ada file seperti itu, mungkin karena skrip cygwin berjalan di direktori yang berbeda. Dalam hal ini shell meninggalkan polanya sendiri (alih-alih menggantinya dengan string kosong). (Kedengarannya seperti kesalahan yang hampir selalu terjadi sampai seseorang menyadari bahwa seseorang dapat melewati pola dengan tanda findkutip seperti itu.) (2) Nama file sebenarnya * .XML (dalam huruf kapital) dan opsi shell nocaseglobdiatur dalam pembuatan shell git case globs tidak sensitif (yang masuk akal pada Windows).
Peter A. Schneider