Wie führe ich ein Shell-Skript aus, ohne die Befehle "sh" oder "bash" zu verwenden?

261

Ich habe ein Shell-Skript, das ich ausführen möchte, ohne die Befehle "sh" oder "bash" zu verwenden. Beispielsweise:

Anstatt: sh script.sh

Ich möchte benutzen: script.sh

Wie kann ich das machen?

PS (i) Ich verwende nicht viel Shell-Skript und habe versucht, über Aliase zu lesen, aber ich habe nicht verstanden, wie man sie verwendet.

(ii) Ich habe auch gelesen, wie man das Skript mit einer anderen Datei in den PATH-Variablen verknüpft. Ich verwende meinen Universitätsserver und habe keine Berechtigung zum Erstellen einer Datei an diesen Speicherorten.

Rameez Hussain
quelle
1
Die Antworten geben an, wie das Skript ausführbar gemacht werden kann, scheinen jedoch nicht zu beschreiben, wie es zugänglich gemacht werden kann. Erstellen Sie dazu ein bin-Verzeichnis - $HOME/bin- falls Sie noch keines haben, fügen Sie es Ihrem PATH hinzu (in der Nähe der Vorderseite). Fügen Sie die Skripte (und alle anderen Programme), die Sie ausführen möchten, direkt ein, ohne den Pfadnamen hier anzugeben, oder fügen Sie hier Symlinks zu den tatsächlichen Programmen ein.
Jonathan Leffler
1
Nachdem Sie den Antworten unten gefolgt sind, können Sie die Datei umbenennen, um die ".sh" zu löschen: mv example.sh exampleund examplesollten dann selbstständig arbeiten.
PJ Brunet

Antworten:

434

Fügen Sie oben in Ihrer Datei einen "shebang" hinzu:

#!/bin/bash

Und machen Sie Ihre Datei ausführbar ( chmod +x script.sh).

Ändern Sie abschließend Ihren Pfad, um das Verzeichnis hinzuzufügen, in dem sich Ihr Skript befindet:

export PATH=$PATH:/appropriate/directory

(Normalerweise möchten Sie $HOME/binIhre eigenen Skripte speichern.)

fge
quelle
Hey danke für deine Antwort. Das habe ich ausprobiert. Jetzt kann ich es ohne den Befehl "sh" ausführen. Aber ich muss dem Befehl immer noch "./" voranstellen, was ich nicht möchte. :)
Rameez Hussain
5
Siehe Kommentare zum Pfad. Sie müssen Ihr Skript in einem Verzeichnis ablegen, das Sie an Ihren PATH anhängen müssen.
fge
2
In meinem Fall hat es nicht funktioniert. aber source script.shfunktionierte gut, oder besser gesagt source <filename_without_any_extension_type>
MycrofD
4
source ./my-cool-script(oder . ./my-cool-script) verschmutzt die aktuelle Shell-Sitzung mit allen im Skript definierten Variablen. Sourcing sollte nicht verwendet werden, es sei denn, Sie möchten die Shell-Sitzung explizit ändern, indem Sie Umgebungsvariablen festlegen, das Verzeichnis ändern usw. Andernfalls können wirklich schreckliche Fehler auftreten, da Variablen aus einer Skriptausführung, wenn sie über Sourcing ausgeführt werden, eine andere Skriptausführung beeinflussen können.
Daniel Waltrip
3
Wenn Sie sicher sind, dass sich der Skriptordner in PATH befindet und ohne ihn immer noch nicht funktioniert ./, liegt möglicherweise eine Namenskollision vor. Versuchen Sie es umzubenennen.
Chorbs
66

Dies sind einige der Voraussetzungen für die direkte Verwendung des Skriptnamens:

  1. Fügen Sie die she-bang (#!/bin/bash)Zeile ganz oben hinzu.
  2. Verwenden Sie chmod u+x scriptnamemake das Skript ausführbar. (Wo scriptnameist der Name Ihres Skripts)
  3. Legen Sie das Skript unter /usr/local/binOrdner.
  4. Führen Sie das Skript nur mit dem Namen des Skripts aus.

Hinweis: Der Grund, warum ich vorgeschlagen habe, es unter einem /usr/local/binOrdner abzulegen, ist, dass der Pfad höchstwahrscheinlich bereits zu Ihrem hinzugefügt wurde PATH variable.

Aktualisieren:

Wenn Sie keinen Zugriff auf den /usr/local/binOrdner haben, gehen Sie wie folgt vor:

  1. Erstellen Sie einen Ordner in Ihrem Home-Verzeichnis und nennen Sie ihn myscripts.
  2. Führen Sie dies ls -lartin Ihrem Home-Verzeichnis durch, um das Startskript zu identifizieren, das Ihre Shell verwendet. Es sollte entweder sein .profileoder .bashrc.
  3. Wenn Sie das Startskript identifiziert haben, fügen Sie die folgende Zeile in Ihr Skript ein - export set PATH=$PATH:~/myscript.
  4. Nach dem Hinzufügen geben Sie Ihr Startskript ein oder melden Sie sich ab und wieder an.
  5. Führen Sie Ihr Skript mit aus scriptname.
jaypal singh
quelle
Ich habe es versucht, aber ich habe nicht die Berechtigung, auf den Ordner / usr / local / bin zuzugreifen. Ich benutze einen Universitätscomputer.
Rameez Hussain
1
Könnten Sie mir bitte sagen, was Sie unter "Quelle Ihres Startskripts" verstehen?
Rameez Hussain
1
Wenn Sie das Startskript beziehen, müssen Sie es ausführen, damit der neu auf die Variable PATH gesetzte Parameter von der Shell übernommen wird. Dies kann dadurch geschehen . .bashrc. Das heißt, setzen Sie einfach .gefolgt von spaceund dann Ihren Startskriptnamen.
Jaypal Singh
Ich weiß nicht, was das Problem mit dem System ist. Ich habe ein neues Shell-Skript namens "Hallo" mit nur einem "Echo" Hallo "" erstellt. Ich habe die Berechtigungen geändert und versucht ./Hallo. Es funktioniert nicht. es heißt
Rameez Hussain
Welche Änderungen haben Sie an Ihren Startskripten vorgenommen?
Jaypal Singh
20

Stellen Sie einfach sicher, dass es ausführbar ist chmod +x. Standardmäßig befindet sich das aktuelle Verzeichnis nicht in Ihrem PATH, daher müssen Sie es als ausführen ./script.shoder auf andere Weise über einen qualifizierten Pfad referenzieren. Wenn Sie wirklich nur etwas brauchen script.sh, müssen Sie es alternativ zu Ihrem PFAD hinzufügen. (Möglicherweise haben Sie keinen Zugriff, um den Systempfad zu ändern, aber Sie können mit ziemlicher Sicherheit den PFAD Ihrer eigenen aktuellen Umgebung ändern.) Dies setzt auch voraus, dass Ihr Skript mit so etwas beginnt #!/bin/sh.

Sie können auch weiterhin einen Alias ​​verwenden, der nicht wirklich mit Shell-Skripten zusammenhängt, sondern nur mit der Shell. Er ist einfach wie folgt:

alias script.sh='sh script.sh'

script.shDies würde es Ihnen ermöglichen, einfach (buchstäblich - dies funktioniert für keine andere *.shDatei) anstelle von zu verwenden sh script.sh.

ziesemer
quelle
Hallo! Danke für deine Antwort. Ich habe früher versucht, Aliase zu verwenden. Aber nichts ist passiert. Ich habe es unmittelbar nach der Zeile "#! / Usr / local / bin / bash" platziert. Was denkst du ist falsch?
Rameez Hussain
1
Ein Alias ​​kann in Ihrem Skript nicht definiert werden - er muss als Teil Ihrer aktuellen Umgebung deklariert werden. Führen Sie den aliasBefehl einfach an der Shell-Eingabeaufforderung aus, und dann steht der Alias ​​zur Verfügung, mit dem der Befehl ausgeführt werden kann.
ziesemer
17

In diesem Beispiel wird die Datei aufgerufen myShell

Zunächst müssen wir diese Datei erstellen, indem wir Folgendes eingeben:

sudo nano myShell

Beachten Sie, dass wir die .shErweiterung nicht gesetzt haben ? Das liegt daran, dass wir beim Ausführen vom Terminal nur eingeben myShellmüssen, um unseren Befehl auszuführen!

In Nano MUSS die oberste Zeile sein, #!/bin/bashdann können Sie eine neue Zeile verlassen, bevor Sie fortfahren.

Zur Demonstration werde ich eine grundlegende Hello World!Antwort hinzufügen

Also tippe ich Folgendes ein:

echo Hello World!

Danach sollte mein Beispiel so aussehen:

#!/bin/bash
echo Hello World!

Speichern Sie nun die Datei und führen Sie den folgenden Befehl aus:

sudo chmod +x myShell

Jetzt haben wir die Datei ausführbar gemacht, in die wir sie /usr/bin/mit dem folgenden Befehl verschieben können:

sudo cp myShell /usr/bin/

Um sicherzustellen, dass der Computer ordnungsgemäß ausgeführt werden kann, müssen wir den Computer neu starten

ich benutzte sudo shutdown -r now

Glückwunsch! Unser Befehl ist jetzt erledigt! Im Terminal können wir tippen myShellund es sollte heißenHello World!

Tripleee
quelle
1
Sie sollten keine eigenen Dateien /usr/bineinfügen - viele Systeme speichern sich /usr/local/binzu diesem Zweck und reservieren /usr/binausschließlich für das Betriebssystem.
Tripleee
Es ist keine sudo chmodeigene Datei erforderlich .
Tripleee
Der Computer muss nicht neu gestartet werden. Sie sollten höchstens noch einmal
beschaffen
14

Sie müssen das ausführbare Bit für das Programm aktivieren.

chmod +x script.sh

Dann können Sie verwenden ./script.sh

Sie können den Ordner dem PATH in Ihrer .bashrcDatei hinzufügen (in Ihrem Home-Verzeichnis). Fügen Sie diese Zeile am Ende der Datei hinzu:

export PATH=$PATH:/your/folder/here
Uku Loskit
quelle
Ich habe vergessen zu erwähnen, dass ich bereits die richtigen Berechtigungen festgelegt habe. Ich habe den Befehl "chmod 755 script.sh"
Rameez Hussain
6

Sie können sudo install (Name des Skripts) / usr / local / bin / eingeben (was Sie eingeben möchten, um das Skript auszuführen)

Beispiel: sudo install quickcommit.sh /usr/local/bin/quickcommit Passwort eingeben

Jetzt kann ohne .sh und in jedem Verzeichnis ausgeführt werden

JoelWass
quelle
3

Hinzufügen . (aktuelles Verzeichnis) zu Ihrer PATH-Variablen.
Sie können dies tun, indem Sie Ihre .profile-Datei bearbeiten.
Fügen Sie die folgende Zeile in Ihre .profile-Datei ein. Stellen Sie
PATH=$PATH:.

einfach sicher, dass Sie #!/bin/basham Anfang Ihres Skripts die Zeile Shebang ( ) hinzufügen und das Skript ausführbar machen (using chmod +x <File Name>).

Arpit Tyagi
quelle
0

Hier ist mein Backup-Skript, das Ihnen die Idee und die Automatisierung gibt:

Server: Ubuntu 16.04 PHP: 7.0 Apache2, MySQL usw.

# Make Shell Backup Script - Bash Backup Script
    nano /home/user/bash/backupscript.sh
        #!/bin/bash
        # Backup All Start
        mkdir /home/user/backup/$(date +"%Y-%m-%d")
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_rest.zip /etc -x "*apache2*" -x "*php*" -x "*mysql*"
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_apache2.zip /etc/apache2
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_php.zip /etc/php
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_mysql.zip /etc/mysql
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/var_www_rest.zip /var/www -x "*html*"
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/var_www_html.zip /var/www/html
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/home_user.zip /home/user -x "*backup*"
        # Backup All End
        echo "Backup Completed Successfully!"
        echo "Location: /home/user/backup/$(date +"%Y-%m-%d")"

    chmod +x /home/user/bash/backupscript.sh
    sudo ln -s /home/user/bash/backupscript.sh /usr/bin/backupscript

Ändern Sie / home / user in Ihr Benutzerverzeichnis und geben Sie: backupscript an einer beliebigen Stelle auf dem Terminal ein, um das Skript auszuführen! (vorausgesetzt, / usr / bin befindet sich auf Ihrem Weg)

Tarik
quelle
0

Geben Sie "#!/bin/sh"vor dem Skript. Speichern Sie es dann wie script.shzum Beispiel. Kopieren in $HOME/bin oder $HOME/usr/bin
Das Verzeichnis kann in verschiedenen Linux-Distributionen unterschiedlich sein, aber sie enden mit 'bin' und befinden sich im Home-Verzeichnis cd $HOME/bin oder $HOME/usr/bin
Typ chmod 700 script.sh
. Sie können es einfach ausführen, indem Sie run.sh auf dem Terminal tippen . Wenn es nicht funktioniert, versuchen Sie es chmod +x run.sh stattdessen chmod 700 run.sh

Gyan Prakash
quelle
Die Teile dieser Antwort, die keine Informationen aus sehr alten vorhandenen Antworten wiedergeben, sind verwirrt.
Tripleee
0

Machen Sie eine beliebige Datei als ausführbar


Angenommen, Sie haben eine ausführbare Datei mit dem Namen migrate_linux_amd64 und möchten diese Datei als Befehl wie "migrieren" ausführen.

  1. Testen Sie zuerst die ausführbare Datei vom Dateispeicherort aus:
[oracle@localhost]$ ./migrate.linux-amd64 
Usage: migrate OPTIONS COMMAND [arg...]
       migrate [ -version | -help ]

Options:
  -source          Location of the migrations (driver://url)
  -path            Shorthand for -source=file://path 
  -database        Run migrations against this database (driver://url)
  -prefetch N      Number of migrations to load in advance before executing (default 10)
  -lock-timeout N  Allow N seconds to acquire database lock (default 15)
  -verbose         Print verbose logging
  -version         Print version
  -help            Print usage

Commands:
  goto V       Migrate to version V
  up [N]       Apply all or N up migrations
  down [N]     Apply all or N down migrations
  drop         Drop everyting inside database
  force V      Set version V but don't run migration (ignores dirty state)
  version      Print current migration version
  1. Stellen Sie sicher, dass Sie Ausführungsberechtigungen für die Datei haben.
    -rwxr-xr-x 1 oracle oinstall 7473971 May 18 2017 migrate.linux-amd64
    Wenn nicht, führen Sie sie auschmod +x migrate.linux-amd64

  2. Dann kopieren Sie Ihre Datei nach /usr/local/bin. Dieses Verzeichnis gehört root. Verwenden Sie sudo oder wechseln Sie zu root und führen Sie den folgenden Vorgang aus

sudo cp migrate.linux-amd64 /usr/local/bin
sudo chown oracle:oracle /user/local/bin/migrate.linux.amd64
  1. Erstellen Sie dann einen symbolischen Link wie unten
sudo ln /usr/local/bin/migrate.linux.amd64 /usr/local/bin/migrate
sudo chown oracle:oracle /usr/local/bin/migrate
  1. Fügen Sie schließlich / usr / local / bin zu Ihrem Pfad oder Benutzerprofil hinzu
export PATH = $PATH:/usr/local/bin
  1. Führen Sie dann den Befehl als "migrieren" aus
[oracle@localhost]$ migrate
Usage: migrate OPTIONS COMMAND [arg...]
       migrate [ -version | -help ]

Options:
  -source          Location of the migrations (driver://url)
  -path            Shorthand for -source=file://path 
  -database        Run migrations against this database (driver://url)
  -prefetch N      Number of migrations to load in advance before executing (default 10)
  -lock-timeout N  Allow N seconds to acquire database lock (default 15)
  -verbose         Print verbose logging
  -version         Print version
  -help            Print usage

Commands:
  goto V       Migrate to version V
  up [N]       Apply all or N up migrations
  down [N]     Apply all or N down migrations
  drop         Drop everyting inside database
  force V      Set version V but don't run migration (ignores dirty state)
  version      Print current migration version
Guru
quelle
-1

Gerade:

/path/to/file/my_script.sh
DimiDak
quelle