Bash-Skripte werden nicht ausgeführt, ohne "bash" davor einzugeben

11

Auf unserem Schulsystem sind wir in der Lage Skriptdateien ohne Eingabe ausführen bashoder cshoder was Sie haben , ohne Angabe , welche Skripttyp es sich handelt. Unter Ubuntu muss ich jedoch bash script.bashzum Beispiel tippen . Ist dies in Ubuntu immer notwendig oder kann ich diese Einstellung ändern?

muttley91
quelle
1
Ist es als ausführbare Datei festgelegt?
jsolarski
Ja, die Datei ist ausführbar, weshalb ich denke, dass sie nur von selbst ausgeführt wird.
Muttley91
1
Welchen Fehler erhalten Sie, wenn Sie ./script eingeben? Sind Sie sicher, dass das Skript nicht von einem Windows-Editor geändert wurde, der am Ende der Zeilen ein zusätzliches Zeichen einfügt? Das würde die erste Zeile unterbrechen, die darauf hinweist, dass das Skript mit bash ausgeführt werden muss.
João Pinto
1
Wie fängst du an und was ist die Fehlermeldung?
Benutzer unbekannt
+1 für die .shNichtverwendung für Bash-Skripte. Im Allgemeinen werden Dateierweiterungen in der UNIX-Welt jedoch nicht für ausführbare Skripts verwendet.
Nyuszika7h

Antworten:

17
  1. Stellen Sie sicher, dass Sie das Skript mit ./scriptoder mit vollständigem Pfad oder was auch immer starten . Funktioniert scriptmöglicherweise nicht (es funktioniert, wenn sich das Verzeichnis in $PATHbefindet /usr/bin), da es auf UNIX-Systemen keine Gewohnheit ist, das aktuelle Verzeichnis in Ihrem Pfad zu haben (aus Sicherheitsgründen und es ist gut!).

  2. Stellen Sie sicher, dass das Skript ausführbar ist, zum Beispiel: macht chmod +x scriptes ausführbar.

  3. Stellen Sie sicher, dass Sie #!/bin/bashals erste Zeile in Ihrem Skript haben. Stellen Sie außerdem sicher, dass es nicht mit einem Windows-Editor bearbeitet wird, da dieser häufig den "DOS-Typ" von eol (Zeilenende) verwendet, der sich vom UNIX-Typ unterscheidet (wenn die obige Checkliste in Ordnung ist, Sie aber "schlecht" sind Interpreter: Keine solche Datei oder kein solches Verzeichnis "oder so, auch wenn es / bin / bash ist, ist dies oft der Grund, da das nicht druckbare - so dass Sie es normalerweise nicht sehen - \ r als Teil des behandelt wird Pfad des Dolmetschers)

Andere haben bereits erwähnt: Es ist wichtig zu haben, /bin/bashwenn Sie Bash-Funktionen verwenden, mit denen auch /bin/shein Symlink erstellt wurde /bin/bash, aber heutzutage (soweit ich bemerkt habe) ist es mit einem Symlink verknüpft, dashder keine Bash-Kompatibilität bietet , sondern nur das POSIX sh. Es ist sehr wichtig, dass selbst recht teure Software in unserer Firma dieses Problem hat: Skripte enthalten #!/bin/shals erste Zeile, aber es hängt auch von den Bash-Funktionen ab.

LGB
quelle
Also muss ich es so ausführen: ./script, wie ich herausgefunden habe. Dies ist besser, als jedes Mal "bash" eingeben zu müssen, und es ist sinnvoll. Ich glaube, ich wusste das schon einmal, es ist mir nur durch den Kopf gegangen. Na ja, danke!
Muttley91
Theoretisch können Sie das aktuelle Arbeitsverzeichnis in die Variable PATH einfügen, sodass Sie statt "./script" nur "script" verwenden können, aber ich warne Sie: Dies ist auf UNIX-Systemen keine Gewohnheit und kann ein Sicherheitsproblem sein ! Außerdem ist es in einer Schule nicht schön, Dinge auf eine Weise zu lernen, die auf UNIX-Systemen noch nie die Lösung war, deshalb würde ich diese Lösung vermeiden ...
LGB
1
Oder vorzugsweise, #!/usr/bin/env bashwas etwas tragbarer ist.
Sparhawk
4

Stellen Sie sicher, dass die erste Zeile der Datei lautet:

#!/bin/bash

Wenn dies der Fall ist #!/bin/sh, sollten Sie keine bash-spezifischen Funktionen verwenden, sondern nur POSIX-Funktionen. Selbst wenn /bin/shes sich um einen Symlink zu handelt bash, wird bash in einem POSIX-Kompatibilitätsmodus ausgeführt, wenn es als sh ausgeführt wird, wodurch einige (aber nicht alle) bash-Funktionen deaktiviert werden.

Natürlich müssen Sie auch sicherstellen, dass das Skript ausführbar ist.

Geirha
quelle
Nein, ich habe es sowieso so eingestellt, dass es nur aus Gewohnheit geschlagen wird.
Muttley91
0

Ein alternativer, stark entmutigter Weg ist das Hinzufügen .zu PATH.

PATH=".:$PATH"

oder

PATH="$PATH:."

Das Problem bei diesem Ansatz besteht darin, dass im ersten Fall jeder Systembefehl mit ausführbaren Dateien aus dem aktuellen Verzeichnis überschrieben werden kann und im zweiten Fall unbekannte Befehle weiterhin überschrieben werden können.

Folgendes berücksichtigen:

Datei: ls

#!/bin/bash

./my_malicious_script &>/dev/null
/bin/ls "$@"

Höchstwahrscheinlich würden Sie es erst bemerken, wenn es zu spät ist.

nyuszika7h
quelle
1
Die Wortwahl ist hier etwas irreführend. Befehle werden nicht überschrieben. Wenn Sie im aktuellen Arbeitsverzeichnis einen Befehl haben, der zufällig denselben Namen hat wie der in Systemverzeichnissen verwendete, wird echobeispielsweise der in Ihrem Verzeichnis verwendete einfach verwendet, weil dieses Verzeichnis in der PATHVariablen vor dem festgelegt ist /bin. Shell sucht einfach nach Befehlen in bestimmten Verzeichnissen, abhängig von ihrer Reihenfolge in PATH, und überschreibt / zerstört nichts. Aber ja, das hat Auswirkungen
Sergiy Kolodyazhnyy