Wie führe ich eine .sh-Datei unter Windows aus?

67

Wenn ich versuche, eine Datei (name.sh) in der Befehlszeile mit dem Befehl ./name.sh auszuführen, erhalte ich die Fehlermeldung, dass:

"." wird nicht als interne oder externe Befehls-, Betriebs- oder Stapeldatei erkannt

Bitte helfen Sie mir beim Ausführen der .sh-Datei

Broam
quelle

Antworten:

74

Sie sind auf Windows CMD.EXE (von der Fehlermeldung). Es wird eine andere Syntax zum Ausführen von Befehlen verwendet. Sie müssen verwenden sh name.sh, vorausgesetzt, Sie haben Cygwin oder ähnliches installiert.

Zur Verdeutlichung verfügt Windows nicht über ein integriertes Dienstprogramm zur Unterstützung von SH-Dateien. Um dies auszuführen, müssen Sie ein Drittanbieter-Tool wie Cygwin installieren .

Roger Lipscombe
quelle
7
Könntest du Git auch nicht einfach unter Windows installieren? Es scheint, dass dies die Unterstützung für Shell-Skripte hinzufügt, selbst wenn diese Shell-Skripte keine Git-bezogenen Aufgaben ausführen.
DaveTheMinion
2
@DavidB Ja, das funktioniert, wenn Sie C: \ Programme (x86) \ Git \ bin (oder was auch immer auf Ihrem Computer ist) in Ihren PATH einfügen, da Git dort alle möglichen nützlichen Tools ablegt, einschließlich sh.exe
Sumyrda
1
@DavidB Ja, Git Bash weiß, was zu tun ist, richtig!
Legenden
13

Sie versuchen, an der Windows-Eingabeaufforderung einen Linux-Befehl auszuführen.

Unter Linux ist der Schrägstrich ein Pfadtrenner. Unter Windows ist der umgekehrte Schrägstrich ein Pfadtrennzeichen und der Schrägstrich in der Regel ein Argument.

Aus diesem Grund denkt Windows, Sie versuchen, einen Befehl mit dem Namen "." und parst es das Argument "/name.sh". Die korrekte Konvention wäre ". \ Name.sh". Außerdem durchsucht Windows automatisch das aktuelle Verzeichnis nach Ihrem Befehl, sodass Sie einfach "name.sh" eingeben können.

Das nächste Problem, mit dem Sie konfrontiert werden, ist, dass Windows nicht weiß, was ein sh-Skript ist. Auch dies ist eine Linux-Sache. Sie können dieses Problem lösen, indem Sie Cygwin installieren, wenn Sie wirklich ein sh-Skript ausführen möchten oder müssen.

Nach einem Ihrer vorherigen Kommentare können Sie das Skript jedoch genauso gut in name.bat umbenennen und die Zeile "#! / Bin / sh" löschen. Jetzt haben Sie eine Batch-Datei, die Windows verstehen sollte. Weitere Informationen zu Batchdateien finden Sie hier .

Martin Fido
quelle
12

Alternativ können Sie sich auch der dunklen Seite zuwenden und Linux installieren. Von der Eingabeaufforderung:

sh runide.sh

oder

sudo sh runide.sh

Ihr Programm wird ausgeführt und Sie werden auch ein besseres System haben.

Steve
quelle
15
Das ist so, als würde man sagen: "
Werde
7

Beste Lösung meiner Meinung nach:

  • Laden Sie .git für Windows herunter und installieren Sie es

  • Rechtsklicke auf den Desktop und sage "git bash here"

  • Führen Sie Ihr Skript wie unter Unix aus

  • Getan!

Achtung: Viele Befehle funktionieren unter Windows nicht! Trotzdem werden viele grundlegende Dinge funktionieren.

Wenn Sie dieses Skript regelmäßig benötigen, möchten Sie möglicherweise eine Verknüpfung erstellen (z. B. auf Ihrem Desktop):

  • Erstellen Sie eine Verknüpfung zu mintty.exeauf Ihrem Desktop

  • Bearbeiten Sie die Eigenschaften der Verknüpfung und ändern Sie das Ziel (behalten Sie den Pfad bei):

  • C:\Program Files\Git\usr\bin\mintty.exe" -h always /bin/bash -l -e 'D:\folder\script.sh'

Heanz
quelle
Das funktioniert nicht. Wenn ich @FOR / f "tokens = *"% i IN (Standardeinstellung 'docker-machine env --shell cmd') ausführe, mache ich @% i. Ich erhalte ein unerwartetes Zeichen (
Steve Tomlin
5

Sie versuchen, Ihr Auto mit Orangensaft anstelle von Benzin zu fahren. Windows teilt ähnliche Befehle, die in BAT- oder CMD-Dateien gespeichert sind, mit Unix / Linux / zOS-Unix-Subsystem / * ix-Shellskripten, da diese beiden Betriebssystemfamilien einen gemeinsamen Vorfahren der DEC PDP-x-Maschinen haben.

Wenn Sie sofortige Befriedigung wünschen, müssen Sie eine Umgebung installieren, die ein "sh.exe" -Programm oder "csh.exe" - oder "bash.exe" -Programm bereitstellt (tsh.exe jedermann?).

Alternativ können Sie, wenn Sie Unix-Skriptbefehle sehr gut kennen und die Windows-Befehle .cmd und .bat sehr gut kennen, die .sh-Datei in eine .bat- oder .cmd-Datei übersetzen. Trotzdem werden Sie oft auf mehr Programme im Unix-Stil stoßen, die unter Windows keine Entsprechung haben - grep, sed, vi, emacs usw. Daher der Aufruf, CygWin zu installieren (kein Minimalist) - nur um die Shell und Unix zu bekommen Werkzeuge. Legen Sie es für diese besonderen Anlässe auf ein Flash-Laufwerk.

JM
quelle
3

Jemand sagte etwas über MS-DOS, das /für Befehle und \für Pfade verwendet. Das ist leicht irreführend. Schauen Sie sich mein Beispiel an:

C:\myfoo\foo\>cd../.. 
C:\myfoo\foo\>cd..\..

Hat keinen Unterschied in der Wirkung. Ja, dies gilt nicht für alle Vorgänge. Die eigentliche Antwort lautet einfach Nein . Ohne Cygwin oder SSHD ist dies nicht möglich.

Ich weiß nur , weil ich dummerweise, um herauszufinden, einen halben Tag damit verbracht , was if then fiund eval, exectun , -Djava.somethingwenn sie aufgerufen.

grizzleybear123
quelle
2

Verwenden Sie Github für Windows. Es enthält alle ausführbaren Dateien der Unix-Umgebung.

https://github-windows.s3.amazonaws.com/GitHubSetup.exe

Nederealm
quelle
1
Genauer gesagt, installieren Sie Git. Der einzige Grund, warum die Installation von Github für Windows eine Bash-Shell beinhaltet, ist, dass sie mit Git geliefert wird. :)
ZaLiTHkA
Gute Alternative, danke, Sie müssen also nicht mehr Werkzeuge installieren. 1
Guilherme Nascimento
1

Ich habe eine andere und einfache Lösung gefunden, UnixUtil .

Laden Sie es herunter und entpacken Sie es auf Laufwerk C :. Legen Sie die Umgebungsvariable fest path, die eingeschlossen werden soll C:\UnixUtils\usr\local\wbin.

Das ist wichtig. Setzen Sie den Pfad NICHT aufC:\UnixUtils\bin

prabhanjan deshpande
quelle
1

Der Vollständigkeit halber möchte ich ein neues Feature „Windows-Subsystem für Linux“ für Windows 10 erwähnen. Die Details sind unter http://www.howtogeek.com/249966/how-to-install-and-use-the-linux- beschrieben. bash-shell-on-windows-10 /

Beachten Sie, dass Sie dafür den Schalter „Developer Mode“ aktivieren und die Option „Windows Subsystem for Linux (Beta)“ aktivieren müssen.

Für mich selbst fand ich, dass die Installation von Git für Windows (die ich sowieso benutze) ausreicht.

Michael Freidgeim
quelle
1

Dies ist ein alter Thread, aber für Benutzer unter Windows 10. Öffnen Sie einfach die Windows-Funktionen über die Systemsteuerung "Windows-Funktionen aktivieren oder deaktivieren".

Wählen Sie die Funktion 'Windows-Subsystem für Linux'. Nach der Installation haben Sie 'Bash' und können sogar native Linux-Server in bash konfigurieren. Und natürlich funktioniert auch der Befehl sh innerhalb von bash.

Egbert
quelle
0

Möglicherweise liegt das Problem tatsächlich in der Datei name.sh- Sie versuchen, den .Befehl zu verwenden, aber es wird versucht, eine Art Shell (z. B. cshglaube ich) auszuführen , in der dies kein gültiger Befehl ist.

Also: Fängt das name.shmit dem richtigen an #!/bin/sh(wenn du tatsächlich versuchst zu rennen sh)?

Andrew Jaffe
quelle
1
ja es startet #! / bin / sh cd D: \ Raghu D: winzip32.exe -min -a -r D: \ p das ist der Inhalt der Datei
0

ok, es ist VIEL falsch daran - lösche das #! / bin / sh und ändere die Erweiterung auf bat, und es könnte mit ein paar weiteren Korrekturen funktionieren. Dann können Sie es auch über den Dateinamen aufrufen.

Die Syntax eines Unix-Shell-Skripts und einer Windows-Batchdatei ist nicht allzu ähnlich. Cygwin oder eine Menge Unxutils könnten etwas bewirken, das in beiden Fällen funktioniert, aber wenn Sie nicht absolut sicher sind, dass die Umgebung immer gleich ist, lohnt es sich nicht, sich Sorgen zu machen

Geselle Geek
quelle
drop the #!/bin/sh, and change the extention to bat, and it might work with a few more fixes.Was?! Ich vermute, Sie haben es noch nie versucht ... Unter Windows werden selbst die einfachsten Bash-Funktionen nicht unterstützt oder erfordern eine lange Syntax.
Camilo Martin
Der zweite Absatz behandelt die Tatsache, dass es wahrscheinlich nicht funktioniert, ohne eine angemessene Menge an Arbeit.
Geselle Geek
Nun, du hast recht.
Camilo Martin
0

Wenn Sie zu Hause (oder bei der Arbeit) eine Linux-Box haben, die an dasselbe Netzwerk angeschlossen ist, und dieses Netzwerk sicher ist, kann dies den Trick bewirken:

  1. Erstellen Sie eine Ordnerfreigabe unter Windows (ziemlich einfach, aber stellen Sie sicher, dass das Netzwerk vor Eindringlingen geschützt ist).
  2. mount //WinMachine/Share LinuxFolderMounten Sie es unter Linux mit (IIRC und erfordert Samba ).
  3. Melden Sie sich mit PuTTY remote bei dieser Linux-Box an.
  4. Führen Sie Ihren Befehl im bereitgestellten Ordner aus.
Camilo Martin
quelle
0

So führen Sie das Shell-Skript unter Windows aus Verwenden Sie zuerst den Befehl: dos2unix, dann können Sie Ihren normalen Befehl verwenden: sh runide.sh

Das wird klappen.

Sridhar GV
quelle
Es tut uns leid, eine leichte Korrektur muss durchgeführt werden. Verwenden Sie den Befehl: "dos2unix runide.sh" Ausgabe: dos2unix: Konvertieren der Datei runide.sh in das UNIX-Format. Dann verwenden Sie den Befehl: "sh runide.sh". Dadurch wird Ihr Shell-Skript mit Sicherheit ausgeführt.
Viel
Die Frage ging nicht um das Dateiformat, sondern um das Fehlen einer Shell in Windows.
Archemar
0

Obwohl die bestehenden hier Antworten zu der Zeit richtig, 10 Windows - ist nun auch optional eine modifizierte Version von Ubuntu eines vollständig Bash - Shell ausgeführt wird .

Einmal ausführbar gemacht, können Skripte auf die übliche Weise aus der Bash heraus ausgeführt werden, zB:

chmod +x myscript.sh
./myscript.sh

Wenn Sie ein Skript direkt unter Windows ausführen möchten, können Sie im selben Verzeichnis eine Verknüpfung erstellen und als "Ziel" Folgendes festlegen:

C:\Windows\System32\bash.exe -c "./myscript.sh"

Wenn der Pfad Ihres Skripts relativ zur Position der Verknüpfung ist (wie im obigen Beispiel), stellen Sie sicher, dass das Feld "Start in" ebenfalls leer ist.

Molomby
quelle