Ich schreibe ein Skript, um einige Dateien zu kopieren und versuche, shopt -s dotglob
cp zu ermöglichen, Dotfiles wie .jshint
und so weiter zu kopieren.
Ich kann shopt -s dotglob
ohne Fehler direkt an einer Bash-Eingabeaufforderung ausgeführt werden. Das Ausführen des Skripts löst jedoch den Fehler aus:
script.sh: 81: script.sh: shopt: not found
Ich führe dieses Skript in der Bash-Shell mit dem Shebang-Header aus #!/usr/bin/env bash
. Fehlerzeile:
shopt -s dotglob
cp -r $TEMP/img/* $TARGET/img/
cp -r $TEMP/js/* $TARGET/js/
cp -r $TEMP/less/* $TARGET/less/
Sie finden bei Google keine hilfreichen Informationen. Haben Sie eine Idee, wo das Problem liegt?
#!/bin/bash
Header?shopt
ist eine eingebaute Bash,sh
hat keineshopt
und die Fehlermeldung sieht aus wie eine Fehlermeldung vondash
. Wahrscheinlich wird hier ein Bash-Skript ausgeführtsh
(was in Ubuntudash
standardmäßig der Fall ist ). Selbst wennsh
es sich um einen Symlink handelt,bash
ist das Ausführen eines Bash-Skriptssh
nicht dasselbe wie das Ausführen mitbash
.Antworten:
Um eine Antwort aus den Kommentaren zu bilden:
Viele Leute laufen aus Gewohnheit mit ihren Skripten
sh
anstattbash
. Dies ist eine gute Vorgehensweise, wenn Portabilität ein Problem darstellt, aber viele Leute tun dies, weil sie etwas kopieren, was sie gesehen haben, ohne es zu verstehen.Sofern Ihr Skript nicht auf einem Nicht-Desktop-Linux-System ausgeführt werden muss (z. B. das Ausführen von Shell-Skripten auf Android-Geräten ist völlig anders), empfehle ich, zu Beginn die Bash-Shebang-Zeile zu verwenden:
Diese Zeile bestimmt, wenn es sich um die erste Zeile im Skript handelt, welcher Interpreter (Shell wie bash oder sh, Python usw.) zur Ausführung aufgerufen wird. Wenn Sie die obige Zeile verwenden, erhalten Sie (fast) dasselbe Verhalten wie über die Befehlszeile, vorausgesetzt, Sie verwenden die Standard-Shell. Wenn Sie aus Gründen der Portabilität oder Präferenz eine andere shebang-Zeile verwenden, beachten Sie, dass Sie die Dokumentation der von Ihnen referenzierten Shell konsultieren müssen, auch wenn die von Ihnen referenzierte Shell ein Symlink zu Bash ist.
quelle
#!/usr/bin/env bash
es die Aufgabe von env ist, zu wissen, welche Bash verwendet werden soll (falls Sie sie beispielsweise gepatcht haben).Sie müssen zsh beenden und bash wie folgt aktivieren:
Führen Sie den Befehl aus
Danach können Sie zsh reaktivieren:
Ich hoffe, das hilft
quelle
~/.basrc
wird in diesem Fall beim Start durch Bash ausgeführt, sodass es nicht erforderlich ist, es explizit aufzurufen. 3) Wo wird der Befehl des OP ausgeführt? und 4) durchexec
zweimaliges Verwenden verlieren Sie alle Umgebungsänderungen, die Sie in der anfänglichen zsh-Shell vorgenommen haben. Dies würde nicht passieren, wenn Sie nur bash aufrufen würden.