Kann ich Bash-Skripte in FreeBSD ausführen, ohne sie zu ändern?

7

Korrigieren Sie mich, wenn ich falsch liege:

  • "sh" -Skript! = "Bash" -Skript
  • Linux-Skripte sind in Bash geschrieben
  • Bash-Skript normalerweise #!/bin/sh
  • In GNU / Linux /bin/shist Bash
  • In FreeBSD /bin/shist nicht Bash, es ist die wahresh

Wenn ich also ein Linux-Skript in FreeBSD verwenden möchte und ./script.shin der Shell ausgeführt werde, wird das Bash-Skript in "sh" und nicht in Bash ausgeführt, da /bin/shin FreeBSD nicht Bash ist.

Gibt es eine Möglichkeit, diese Bash-Skripte auszuführen, ohne sie zu ändern? Also keine Änderung an der #!/bin/shAnweisung in der Skriptdatei, um auf eine andere Stelle zu verweisen?

Wenn möglich, möchte ich das Bash-Skript über Zsh ausführen. Ich möchte Bash nicht installieren und da Zsh Bash-Skripte ausführen kann ...

user1115057
quelle
Die Aussage "Ich möchte ein bashSkript ausführen, ohne es zu installieren bash" entspricht der Aussage "Ich möchte ein Python-Skript ausführen, ohne Python zu installieren". Wenn es sich um ein bashSkript handelt, sollte es mit einem bashInterpreter ausgeführt werden .
Kusalananda

Antworten:

5

Sie können Ihre Lieblings-Shell mit dem Skript als Parameter aufrufen.

bash ./script.sh
gebogen
quelle
1
"Bash nicht installieren" - OP möchte Bash nicht ausführen.
Mat
1
Nun, es könnte auch zsh sein, deshalb habe ich "Lieblingsschale" geschrieben
Uhr
Aber ohne das Programm bash (oder zsh) mit einem Skript als Argument aufzurufen? In letzter Instanz könnte ich das tun, aber das ./filetoexecute.shist schneller zu schreiben als bash filetoexecute.shoder zsh filetoexecute.sh. Auch seltsam, wie du es sagst ... bash ./something ... Ich habe noch nie jemanden gesehen, der das ./ als Argument verwendet hat
user1115057
Eine andere Möglichkeit wäre, Ihr System so zu ändern, dass zsh als / bin / sh installiert wird.
Arved
@arved Natürlich, nachdem Sie gemacht haben sicher , dass diese Änderung nicht brechen alle Skripte System.
Kusalananda
3

Ich führe FreeBSD selbst aus. Ich habe festgestellt, dass das Starten des Skripts mit den folgenden Funktionen die Kompatibilität zwischen Betriebssystemen erheblich verbessert:

#!/usr/bin/env bash
scriptythekid
quelle
Das ist zwar richtig und hilfreich beim Schreiben eines neuen Skripts, beantwortet die Frage hier jedoch nicht wirklich. Das OP forderte ausdrücklich eine Lösung an, bei der bereits vorhandene Dateien nicht bearbeitet werden müssen, bevor sie verwendet werden können.
Adaephon
2

Sie haben darum gebeten, Sie zu korrigieren, wenn Sie sich geirrt haben. Ich werde es versuchen:

  • Linux-Skripte sind in Bash geschrieben : Nun, einige sind für bash, andere für dashund hoffentlich viel trinkbar für jede POSIX-kompatible Shell.
  • Bash-Skript normalerweise #! / Bin / sh Wenn sie auf nicht standardmäßigen bashFunktionen #!/bin/bashbasieren , wird dringend empfohlen, einen Shebang zu haben
  • In GNU / Linux ist / bin / sh Bash. Das hängt von der Distribution ab. Es kann auch dashoder mkshauf Debian sein.
  • In FreeBSD ist / bin / sh kein Bash, sondern das wahre sh . Es gibt viele shImplementierungen. Welches ist wahr"? Unter FreeBSD shbasiert auf der Almquist-Shell wie dashoder NetBSD sh. Unter OpenBSD basiert es auf pdkshvielen kommerziellen Unices auf ksh88 (die Grundlage für die Unix / POSIX- shSpezifikation). Einige- ksh88basierte Shells bashsind die einzigen zwei Shells, die als Unix-kompatible shImplementierung zertifiziert wurden (wenn sie mit den richtigen Flags erstellt wurden und wenn sie sich in der richtigen Umgebung befinden).

Wenn Sie Skripte mit /bin/shshebang haben und möchten, dass sie von ausgeführt werden zsh, können Sie versuchen, das Skript an zu übergeben zsh. Dies schlägt jedoch fehl, sobald dieses Skript ein anderes Skript aufruft (und Sie es nicht ändern möchten).

Ich sehe also nur die Möglichkeit, einen symbolischen Link von /bin/shzu Ihnen zu haben zsh. Ich empfehle dies jedoch nicht , da dies drastische Auswirkungen auf Ihre Startzeit haben kann und Ihnen bei einigen Ihrer Linux-Skripte nicht einmal hilft.

Philippos
quelle
Beachten Sie, dass , während ich nicht die Installation würde empfehlen , zshals /bin/shentweder, kann es nicht Auswirkungen des Bootens , dass drastisch. Dank seines modularen Aufbaus ist es schlanker als bash. Es ist im Allgemeinen auch schneller als bashund hat einige Optimierungen, die einige ansonsten schlankere / schnellere Schalen dashnicht haben (wie das Optimieren einiger Gabeln). Unter FreeBSD würde das Ändern von sh in bash oder zsh tatsächlich die Leistung beeinträchtigen.
Stéphane Chazelas
@ StéphaneChazelas Vielen Dank für Ihre Bearbeitung und für diese Klarstellung. Das habe ich gemeint: Nicht zshstatt bash, sondern statt einer schnellen Scripting-Shell. Ein weiteres Problem, das hier noch nicht behoben wurde, ist, dass Skripte für Linux, die nirgendwo anders getestet wurden, möglicherweise GNU-Erweiterungen für Standardtools verwenden. Daher bashwürde selbst die Installation nicht helfen.
Philippos
0

Wenn Sie wirklich Linux - basierten geschrieben Skript ausgeführt werden soll , /bin/bashohne Modifizierung sie in FreeBSD, dann können Sie einfach kopieren /usr/local/bin/bashzu /bin/bashauf FreeBSD und es wird funktionieren.

Ashish Tiwari
quelle
1
Ein Symlink wäre besser. Andernfalls wird / bin / bash nicht automatisch aktualisiert, wenn / usr / local / bin / bash aktualisiert wird.
Stéphane Chazelas