2008-09-19 7 views
43

Ich möchte einen langen rsync-Befehl in Cygwin durch Doppelklicken auf eine SH-Datei in Windows ausführen. Es muss im Verzeichnis der Datei beginnen (z. B./cygdrive/c/scripts /), damit die relativen Pfade funktionieren. Hat jemand das zur Arbeit gebracht?Wie kann ich .sh Dateien mit Cygwin verbinden?

Hinweis: Ich habe gerade chere gefunden, ein Cygwin-Paket, das Windows-Kontextmenüs verwaltet (Bash Prompt Here). Es könnte einige Hinweise haben.

Antwort

38

Ok installiert passen, ich habe festgestellt, etwas, das funktioniert. Eine Batch-Datei wie von Vladimir vorgeschlagen zuzuordnen, funktionierte nicht, aber die Bash-Argumente waren der Schlüssel.

Kurz und gut: assoziieren mit diesem Befehl: "C: \ cygwin \ bin \ bash.exe" -li "% 1" % *

Lange Version, wenn Sie nicht wissen, wie:

  1. Wechseln Sie im Explorer zu Extras/Ordneroptionen/Dateitypen.
  2. Ich hatte bereits einen SH-Eintrag für Bash Script. Wenn Sie keinen haben, klicken Sie auf Neu und geben Sie "SH" ein, um einen zu erstellen.
  3. Klicken Sie bei ausgewählter SH-Erweiterung auf Erweitert.
  4. Wählen Sie die Aktion "Öffnen" und klicken Sie auf Bearbeiten (oder erstellen Sie die Aktion).
  5. Dies ist der zu verwendende Befehl: "C: \ cygwin \ bin \ bash.exe" -li "% 1"% *.Beachten Sie, dass ohne die -li, wurde "Befehl nicht gefunden" in meinen Skripts zurück.

Sie können auch SH auf Ihre PATHEXT Umgebungsvariable hinzuzufügen:

WinKey + Pause/Erweitert/Umgebungsvariablen/Systemvariablen/PATHEXT

Danke für Ihre Hilfe, Jungs !

+0

Wenn Ihre Skripts keine Konsoleninteraktion erfordern, können Sie sie mithilfe von cygwin run.exe vollständig fensterlos ausführen. Ändern Sie einfach den Befehl in 'C: \ cygwin \ bin \ run.exe" bash -li "% 1"% * ' –

+12

Jeder weiß, wie man dies in Windows 7? Die Option" Dateitypen "scheint zu fehlen. – adib

+0

Ist da Ein Weg, um es in Cygwins Konsole anstelle der lächerlichen MS-Konsole zu starten, damit Sie etwas wie Kopieren und Einfügen richtig machen können? –

0

Eine Lösung, die funktioniert, ist eine .bat Datei zu erstellen, die Cygwin öffnen und Ihr Skript ausführen wird.

@echo off 

C: 
chdir C:\cygwin\bin 

bash --login -i ./go.sh 
1

Sie sollten in der Lage sein zu assoziieren .sh Dateien mit \ CYGWIN \ usr \ bin \ bash.exe:

Das Skript das Skript go.sh auf meinem Home-Verzeichnis auszuführen. Das Skript muss seine eigene Arbeitsverzeichnis ändern, schlage ich vor, an der Spitze etwas wie dieses Festhalten:

cd `dirname "$0"` 
+0

Die $ 0 ist vielleicht ein guter Einblick, aber es funktioniert nicht für mich. Ich bekomme einen Fehler in Zeile 1: dirname: Befehl nicht gefunden. – Jerph

+0

Damit der Befehl 'dirname' funktioniert, fügen Sie bitte cygwin \ bin dir zum PATH hinzu. – yvolk

2

Dies gilt nicht .sh Dateien zuordnen, aber es könnte Sie bekommen, was Sie wollen. Ich begann mit der cygwin.bat Batch-Datei, die den Cygwin Bash-Shell startet, und modifizierte es etwa so:

$ cat test.bat 
@echo off 

set MYDIR=C:\scripts 

C:\cygwin\bin\bash --login -c "cd $MYDIR && echo 'Now in' `pwd`; sleep 15" 

Das Spielzeug-Skript ist, aber man könnte es ändern rsync nennen oder einen separaten Shell-Skript aufrufe. Ich gebe zu, es wäre schöner, wenn MYDIR nicht hart codiert wäre. Es gibt wahrscheinlich einen Weg, um es automatisch zu setzen.

Oh ja, als ich die .bat-Datei in einer Bash-Shell in Cygwin erstellte, bemerkte ich, dass ich eigentlich "chmod + x test.bat" hatte, bevor ich es mit einem Doppelklick starten konnte. Ich denke, es setzt NTFS-Berechtigungen. Sie müssen das nicht tun, wenn Sie nur Notepad verwendet haben.

+0

Ja, das MYDIR zu codieren ist eine Art Nichtstarter, weil ich möchte, dass andere Teammitglieder dasselbe Skript verwenden können. Kann jemand "es automatisch einstellen"? Wenn dem so ist, scheint das das Ticket zu sein. An dieser Stelle sieht es so aus, als ob wir DOS-Skripterfahrung brauchen ... – Jerph

0

Sehen Sie sich die Befehle assoc und ftype in einer DOS-Box an. Hier ist ein Beispiel für .jpg auf meiner Maschine

c:\>assoc .jpg 
.jpg=jpegfile 

c:\>ftype jpegfile 
jpegfile="C:\Program Files\Common Files\Microsoft Shared\PhotoEd\PHOTOED.EXE" "%1" 

assoc .sh=bashscript 

ftype bashscript="c:\cygwin\bin\bash.exe" "%1" 

Stellen Sie sicher, dass Sie den Pfad im ftype Befehl bash ändern, in dem Sie cygwin

+0

Entschuldigung, diese Befehle funktionierten nicht für mich. – Jerph

14

Hier ist meine Lösung. Es funktioniert gut für meine * .sh-Skripte unabhängig davon, wo sie in der Verzeichnishierarchie sind. Beachten Sie, dass ich vor dem Aufruf von Bash auf dem Cygpath cd in den Cygpath-Verzeichnisname cd. Es funktioniert einfach.

assoc .sh=bashscript 

ftype bashscript=C:\cygwin\bin\bash.exe --login -i -c 'cd "$(dirname "$(cygpath -u "%1")")"; bash "$(cygpath -u "%1")"' 
+0

Ich denke, das ist eine gute Antwort, aber ich habe weder 'assoc' noch' ftpye' in meinem Pfad. Tue ich dies von einer DOS-Eingabeaufforderung? –

+0

Ja. In Win XP, starten-> run cmd. –

+0

Ich habe eine Kombination von Dragos von Jerphs Lösung, die anständig funktioniert (ich führe nach der Verknüpfung). Ich bekomme jedoch eine MS-DOS-Pfadwarnung und denke darüber nach, zu Dragos 'Lösung zu wechseln. Es gibt jedoch das% *, das am Ende fehlt, das (glaube ich) Argumente erlaubt, die an sh-Skripte übergeben werden. Irgendein Grund, den letzten Teil des Dragos-Skripts nicht in: <...; bash "$ (cygpath -u"% 1 ")"% * '>? – Magnus

0

Ich habe einfach nicht gestört. Ich verknüpfte .sh-Dateien mit Crimson Editor (da ich so viel Zeit damit verbringe, die Fehler zu bearbeiten, wie ich sie tatsächlich ausführe). Jetzt geht es darum, die richtige Kombination "Öffnen mit/Bearbeiten mit" in den Dateitypen> Erweitert zu verwenden. Wenn ich wüsste, was DDE-Code Crimson Editor verwendet, würde das die Dinge erleichtern; seit diesem Post konnte ich es jedoch nicht finden.

Das erinnert mich an meine Mac-Tage (1993-2008), als ich Anwendungen für mehr als rudimentäre AppleScript Skriptfähigkeit versuchte und scannte.

BZT

+1

Dies beantwortet die Frage nicht genau ... –

0

I PuttyCyg (genial Kitt in Cygwin Fenster) verwenden hier, wie es geht zu erhalten:

Erstellen Sie eine Batch-Skript, zB

. Ich auf meiner Maschine

C:\Dev\scripts\cygbashrun.bat 

mit Inhalt

SET CYGWIN=nodosfilewarning 
C:\Cygwin\bin\putty.exe -cygterm /bin/bash.exe %1 

Offensichtlich passen sich die Pfade Ihrer installieren von PuttyCyg zu enthalten.

dann in Windows Datei-Explorer gehen Sie auf Extras - Ordneroptionen - Dateitypen

erstellen „.sh“ -Eintrag, wenn es nicht bereits geschehen ist (oder .bash je nachdem, was Sie Ihre Skripte wie zu müssen). . Erweiterte dann ..

[optional Schritt], um das Symbol ändern und das Cygwin-Symbol wählen Sie aus Ihrem installieren

dann:

  1. New ..
  2. Action = Run Bashscript ..
  3. Anwendung für diese Aktion auszuführen = C: \ Dev \ scripts \ cygbashrun.bat "% 1"

wirkt wie ein Zauber für mich: O)

6

Ich arbeite seit einiger Zeit mit der Dragos-Lösung und halte sie für die beste Lösung, da sie die Notwendigkeit beseitigt, in Ihren Shell-Skripten "cypath -u" zu verwenden.

Ich wollte dann zusätzliche Funktionen wie Drag & Drop-Unterstützung für .sh und .bash-Dateien haben. Nach einigen Umgrabungen habe ich eine .bat geschrieben, die .sh- und .bash-Dateien als "bashscript" assoziiert und den Windows Explorer dazu aktiviert, den Drop-Handler für sie zu ziehen. Ich musste den Dragos-Befehl bearbeiten, damit er 1 Argument behandelt (der Pfad zum Element, das in einem Shell-Skript abgelegt wurde).

Die .bat-Datei geht in etwa wie folgt:

echo Registering .sh and .bash files as "bashscript"... 
assoc .sh=bashscript 
assoc .bash=bashscript 
echo. 
echo Setting the run command for the file type "bashscript"... 
ftype bashscript=C:\cygwin\bin\bash.exe --login -i -c 'cd "$(dirname "$(cygpath -u "%%1")")"; bash "$(cygpath -u "%%1")" "$(/argshandler.sh "%%2")"' 
echo. 
echo Activating the drag^&drop capability for "bashscript" files (only 1 dropped item 
echo will be passed to the script, multiple items are not supported yet)... 
reg add HKEY_CLASSES_ROOT\bashscript\shellex\DropHandler /v "" /t REG_SZ /d "{60254CA5-953B-11CF-8C96-00AA00B8708C}" /f 

Der „argshandler.sh“ Skript in der Wurzel nur das erste Argument cygpaths zurück Cygwin es überhaupt erhält und nichts, wenn es keine gibt (zB wenn Sie einfach auf eine Skriptdatei doppelklicken):

Das alles funktioniert bisher recht gut. Es gibt jedoch noch einige Nachteile, die sich gut lösen ließen:

  • Der Befehl von Dragos und meine Ableitung davon scheitern, wenn es um Skripts geht, die sich auf UNC-Pfaden befinden, z. \\ myserver \ myshare \ scriptfile.sh
  • Nur 1 abgelegte Artikel wird an das Shell-Skript übergeben.

Irgendwie über das 1 abgeworfenen-item-einzig Problem, das Argument Handler-Skript zu ändern, wie etwas zurück zu geben

"cygpathed-arg1" "cygpathed-arg2" "cygpathed-arg3" 

und Ändern die Setter von Dragos' Befehl zu so etwas wie

...; bash "$(cygpath -u "%%1")" $(/argshandler.sh "%%2" "%%3" ... "%%9")' 

(beachten Sie, dass die "" um den argshandler.sh Teil gegangen sind) scheint nicht richtig zu funktionieren: Wenn einige der Elemente auf ein Skript gezogen enthalten ein Leerzeichen in ihrem Pfad, diese Pfade werden in mehrere aufgeteilt werden argume nts an den Lücken, obwohl jeder von ihnen in Anführungszeichen eingeschlossen ist ... komisch.

Gibt es Kommandozeilenprofis, die sich dazu bereit fühlen, eines oder beide dieser Probleme zu lösen?

1
Windows Registry Editor Version 5.00 
    ;File:ConfigureShToBeRunUnderExplorer.reg v:1.0 docs at the end 
    [HKEY_CLASSES_ROOT\Applications\bash.exe] 

    [HKEY_CLASSES_ROOT\Applications\bash.exe\shell] 

    [HKEY_CLASSES_ROOT\Applications\bash.exe\shell\open] 

    [HKEY_CLASSES_ROOT\Applications\bash.exe\shell\open\command] 
    @="C:\\cygwin\\bin\\bash.exe -li \"%1\" %*" 

    ; This is a simple registry file to automate the execution of sh via cygwin on windows 7, might work on other Windows versions ... not tested 
    ; you could add this setting by issueing the following command: reg import ConfigureShToBeRunUnderExplorer.reg 
    ; Note the path of your bash.exe 
    ; Note that you still have to add the .sh to your %PATHTEXT% 
      ; usage: double - click the file or reg import file 
0

Ich entwickelte eine .bat-Skript auf meinem eigenen (nicht von anderen Antwort stammt) einen Dateityp zugeordnet werden (zB * .cygwin) mit dieser .bat zu öffnen, wie folgt:

== = Datei run-Skript-mit-Cygwin-in-same-dir.bat ===

@echo off 
REM Info: A script created by Johnny Wong. (last modified on 2014-7-15) 
REM It is used to pass a file argument to run a bash script file. The current directory is setting to the path of the script file for convenience. 
REM Could be copied to C:\cygwin; and then you manually associate .cygwin file extension to open with this .bat file. 
set CYGWIN=nodosfilewarning 

C:\cygwin\bin\bash --login -i -c 'cd "`dirname "%~1"`"; exec bash "%~1" %2 %3 %4 %5 %6 %7 %8 %9' 

REM finally pause the script (press any key to continue) to keep the window to see result 
pause 

=== Datei run-Skript-mit-Cygwin-in-same-dir.bat ===

Detail Erklärungen zur Syntax verwendet (wenn Sie interessiert sind):

  1. % 1 wird "..." zitiert, wenn eine Datei zum Öffnen mit dieser. Zum Ziehen einer Datei in diese .bat-Datei wird "..." nur dann zitiert, wenn der Pfad der Datei Leerzeichen enthält.
  2. % ~ 1 ist die gleiche wie% 1 mit dem umgebenden doppelten Anführungszeichen eliminiert, wenn sie vorhanden sind
  3. verwenden for %%a in (%p%) do set p=%%~a
  4. Sie müssen "%~1" umgebenden Anführungszeichen von% p% zu entfernen, verwenden Sie die Skriptdatei in den Weg zu erzwingen double-quoted, so dass die Ordnertrennzeichen '\' (in% 1) nicht von bash entfernt werden, wenn sie als Escape-Zeichen behandelt werden. Andernfalls funktioniert es nicht, wenn Sie eine Datei, die keine Leerzeichen enthält, in diese .bat-Datei ziehen.
  5. "exec bash" kann einfach "bash" sein, der erste ist zum Speichern von Ressourcen für einen weiteren bash-Prozess.

Genießen :)

1

Dies ist der Befehl, ich verwende:

"C:\cygwin\bin\mintty.exe" -w max -h always -t "%1" -e /bin/bash -li -c 'cd "$(dirname "$(cygpath -u "%1")")" && bash "$(cygpath -u "%1")"' 

Es läuft es in mintty, maximiert wird, setzt den Fenstertitel, um das Skript zu sein RAN (Windows Pfad Es ändert das Verzeichnis in das Skript, führt es aus und bleibt nach dem Abschluss geöffnet.

Alternativ wird der Titel auf dem Cygwin Pfad zum Skript gesetzt:

"C:\cygwin\bin\mintty.exe" -w max -h always -t "%1" -e /bin/bash -li -c 'printf "\033]0;$(cygpath -u "%1")\007" && cd "$(dirname "$(cygpath -u "%1")")" && bash "$(cygpath -u "%1")"' 

Batch-Skripte für Sie die Zuordnung setzen:

Windows-Pfad in Titel:

@echo off 
assoc .sh=shellscript 
ftype shellscript="C:\cygwin\bin\mintty.exe" -w max -h always -t "%%1" -e /bin/bash -li -c 'cd "$(dirname "$(cygpath -u "%%1")")" ^&^& bash "$(cygpath -u "%%1")"' 
pause 

Und cygwin Pfad in Titel:

@echo off 
assoc .sh=shellscript 
ftype shellscript="C:\cygwin\bin\mintty.exe" -w max -h always -t "%%1" -e /bin/bash -li -c 'printf "\033]0;$(cygpath -u "%%1")\007" ^&^& cd "$(dirname "$(cygpath -u "%%1")")" ^&^& bash "$(cygpath -u "%%1")"' 
pause