Soll ich meine Skripte mit der Erweiterung .sh speichern?

66

Ich habe einige Funktionsskripte und möchte sie kopieren /usr/bin, um sie als normale Terminalbefehle zu verwenden. Ist es eine gute Praxis, sie mit der .shErweiterung zu verwenden, oder kann ich sie ohne Erweiterung speichern?

Patterson
quelle
6
Auch wenn Sie möchten, dass diese Skripte allen Benutzern zur Verfügung stehen, ist dies /usr/local/binmöglicherweise die bessere Wahl.
Salem
6
@Salem /usr/binund /usr/local/binsollten für alle Benutzer verfügbar sein, sind jedoch /usr/local/binbesser für ausführbare Dateien geeignet , die nicht Teil von Paketen sind.
Gerrit
Der einzige Vorteil, den ich gesehen habe, ist, dass Redakteure wie vim oder nano von Anfang an wissen, wie man hervorhebt, und das war es auch schon.
Rath
1
@rath Ich erhalte eine Syntaxhervorhebung ohne die Erweiterung, wenn ich den shebang auf #!/usr/bin/env bashoder gesetzt habe #!/bin/bash.
Sparhawk
@ Sparhawk In der Tat, aber ich vergesse es oft, bis ich versuche, das Skript auszuführen;)
Rath

Antworten:

71

Nein, es ist keine gute Praxis, Sie sollten Ihre Skripte ohne Erweiterung behalten. Beachten Sie, dass Skripte, die Teil von Paketen sind, keine .sh- Erweiterung haben, dh update-grub , nicht update-grub.sh . Wenn Sie immer noch nicht überzeugt sind, teilen Sie dem Google Shell Style Guide Folgendes mit:

Ausführbare Dateien sollten keine Erweiterung (stark bevorzugt) oder eine .sh-Erweiterung haben. Bibliotheken müssen die Erweiterung .sh haben und dürfen nicht ausführbar sein.

PS Sie müssen Ihr Skript nicht einfügen /bin. Sie können ein Verzeichnis erstellen ~/binund Ihr Skript dort ablegen. Das Verzeichnis ~/binist $PATHstandardmäßig in enthalten, sodass die dort enthaltenen Skripts wie alle anderen Shell-Befehle ausgeführt werden können.

Gemeinschaft
quelle
4
"Verzeichnis ~ / bin ist $PATHstandardmäßig enthalten" - Seit wann? Wie auch immer, ~/.local/binist wahrscheinlich eine bessere Wahl, da es ein Standard ist.
nyuszika7h
1
Sie meinen "Bibliotheken müssen eine .so-Erweiterung haben", richtig? Nicht sh.
Keith Wolters
3
@KeithWolters zuerst, nicht ich, sondern Google. Zweitens, .sh, nicht .so, wir sprechen von Shell-Skripten, nicht von Binärdateien.
1
Der Google Style Guide ist sehr spezifisch für Google. Beispiel: "Bash ist die einzige Shell-Skriptsprache, die für ausführbare Dateien zulässig ist." Dies ist eindeutig eine interne Regel und keine bewährte Vorgehensweise.
Paul Draper
1
@ nyuszika7h check out ~ / .profile ... es fügt $ HOME / bin in Ihren Pfad ein, wenn das Verzeichnis existiert
Corey Goldberg
9

Ich schließe mich der Empfehlung an, ~/bindie automatisch zu Ihrer hinzugefügt wird $PATH, wie Sergey sagte. Oder /usr/local/bin, was vielleicht schon auf dem ist PATH. Jedoch:

  • Du machst das für dich. Verwenden Sie alles, womit Sie sich wohl fühlen. In der Tat würde ich sagen, dass Sie die Erweiterung behalten, damit Sie daran erinnert werden, dass es sich um Ihr Skript handelt, das Sie ausführen.
  • Erweiterungen sind selten in /usr/bin. In meinem System kann ich nur zwei finden:

    $ dpkg -S `ls /usr/bin/*.sh`
    mtools: /usr/bin/amuFormat.sh
    gettext-base: /usr/bin/gettext.sh

    Wenn Sie also verpacken, lassen Sie die Erweiterung auf jeden Fall weg.

muru
quelle
2
~/binwird $PATHautomatisch hinzugefügt, wenn es vorhanden ist, ohne dass es manuell hinzugefügt werden muss. Erstellen Sie einfach das Verzeichnis, melden Sie sich ab und wieder an.
Sergey
5

Setzen Sie einfach die folgende Zeile oben in die Datei:

#!/bin/bash

Diese Datei wird dann automatisch wie folgt geschrieben: Shell Script ohne Erweiterung!

Denken Sie daran, der Datei die Ausführungserlaubnis zu erteilen.

Um das Skript so zu platzieren, dass es per Direktbefehl ausgeführt werden kann, besuchen Sie: Wo soll ich mein Skript platzieren, damit ich es per Direktbefehl ausführen kann?

Pandya
quelle
2
Oder auch nur #! / Bin / sh, wenn Sie nicht die vollständige Bash-Shell benötigen.
Flickerfly
Viele Betriebssysteme verknüpfen / bin / sh und / bin / bash
Max Coplan