2010-06-18 29 views
3

Nous devons prendre en charge une application héritée qui fournit un port Unix et un port Win32. Malheureusement, plus tard dans le jeu, beaucoup de code de colle a été écrit dans les scripts ksh pour le port unix seulement, et le port Win32 a perdu la parité. J'ai essayé de le faire revivre, et j'ai essayé quelques solutions de ksh-for-windows (une version native de Zsh utilisée dans le passé), mais rien ne semble fonctionner correctement sous Windows 7: Cygwin refuse d'utiliser Win32 et les chemins unix-style, de sorte que certains scripts alambiqués cassent. Même situation pour SUA/SFU. UWin ne fonctionne pas sous Windows 7. Les anciens ports natifs que j'avais l'habitude d'utiliser (WinZsh) ne fonctionnent plus sous 7.Korn-Shell pour Windows 7?

Donc, j'ai besoin d'un Korn-shell qui fonctionnera sous Win 7 (64 bits serait génial, mais j'ai perdu espoir) et qui peut fonctionner avec les deux chemins de style cmd.exe (c:/chemin/vers/app) et les chemins Unix standard (/ chemin/vers/app). Des indices?

Répondre

2

Cygwin prend en charge les chemins de style C:/path/to/app, même s'il aime se plaindre à leur sujet. (Configurer CYGWIN = nodosfilewarning le fermera). Même les chemins avec des barres obliques inverses sont pris en charge, mais ils nécessitent des citations appropriées pour empêcher l'interpréteur de les interpréter.

Pdksh, le "domaine public Korn Shell", peut être installé via setup.exe de Cygwin.

+0

Je n'étais pas au courant de l'indicateur CYGWIN, donc marqué comme meilleur, bien que Cygwin ne correspond pas vraiment à mes spécifications ... –

+0

Les shells sont parmi les programmes Unix les plus difficiles à porter sur Windows natif, parce qu'ils utilisation non triviale de concepts spécifiques à Unix tels que fork()/exec(), les signaux et les terminaux de contrôle. – ak2

3

Cygwin a heureusement remplacé pdksh (mort depuis 1999) avec mksh. Cependant, mksh * ne prend pas en charge les chemins non-POSIX, car il s'agit principalement d'un shell BSD Unix, et l'un de ses points forts est le même sur toutes les plates-formes. Cela étant dit, il existe dos2unixpath et unix2dospath (IIRC) dans Interix. Peut-être que vous pouvez les utiliser.

Quelque chose comme ça pourrait même fonctionner:

function dos2unixpath { 
    local _x=$1 
    [[ $_x = [A-Za-z]:[\\/]* ]] && _x=/dev/fs/${_x::1}/${_x:3} 
    print -r -- "${_x//\\//}" 
} 

Ce convertit x:\foo\bar-/dev/fs/x/foo/bar, ..\bla à ../bla, et laisse le reste seul.