Piszę skrypt do kopiowania niektórych plików i próbuję użyć, shopt -s dotglob
aby umożliwić cp kopiowanie plików typu dot.jshint
i podobnych.
Mogę uruchomić shopt -s dotglob
bezpośrednio po wyświetleniu monitu bez żadnego błędu. Jednak uruchomienie skryptu powoduje zgłoszenie błędu:
script.sh: 81: script.sh: shopt: not found
Uruchamiam ten skrypt w powłoce bash z nagłówkiem shebang #!/usr/bin/env bash
. Linia błędu:
shopt -s dotglob
cp -r $TEMP/img/* $TARGET/img/
cp -r $TEMP/js/* $TARGET/js/
cp -r $TEMP/less/* $TARGET/less/
Nie znalazłeś w Google nic przydatnego, masz pojęcie, na czym polega problem?
#!/bin/bash
nagłówkiem?shopt
jest wbudowanym bashem,sh
nie ma goshopt
, a komunikat o błędzie wygląda jak komunikat o błędzie zdash
. Najprawdopodobniej więc tutaj błąd polega na uruchomieniu skryptu bashsh
(który jestdash
domyślnie w Ubuntu ). Nawet jeślish
jest dowiązaniem symbolicznymbash
, uruchomienie skryptu bashsh
nie jest tym samym, co uruchomienie gobash
.Odpowiedzi:
Aby udzielić odpowiedzi na podstawie komentarzy:
Wiele osób z przyzwyczajenia uruchamia swoje skrypty
sh
zamiastbash
. Jest to dobra praktyka, jeśli przenośność stanowi problem, ale wiele osób robi to, ponieważ kopiuje coś, co widział, nie rozumiejąc tego.O ile skrypt nie musi działać w systemie Linux innym niż stacjonarny (np. Uruchamianie skryptów powłoki na urządzeniach z Androidem jest zupełnie inne), zalecam użycie linii shebang Bash na początku:
Ten wiersz, gdy jest pierwszym wierszem skryptu, określa, który interpreter (powłoka, taka jak bash lub sh, Python itp.) Jest wywoływany w celu jego wykonania. Jeśli użyjesz powyższej linii, otrzymasz takie samo zachowanie (prawie) jak w linii poleceń, zakładając, że używasz domyślnej powłoki. Jeśli ze względu na przenośność lub preferencje używasz innej linii shebang, pamiętaj, że będziesz musiał zapoznać się z dokumentacją powłoki, do której się odwoływałeś, nawet jeśli powłoka, do której się odwołujesz, jest dowiązaniem symbolicznym do Bash.
źródło
#!/usr/bin/env bash
ponieważ zadaniem env jest wiedzieć, której bash użyć (na przykład, jeśli ją załatałeś).Musisz wyjść z zsh i aktywować bash, jak pokazano:
Uruchom polecenie
Po czym możesz reaktywować Zsh:
Mam nadzieję, że to pomaga
źródło
~/.basrc
jest uruchamiany przez bash podczas uruchamiania w tym przypadku, więc nie ma potrzeby jawnego wywoływania go, 3) gdzie jest wykonywane polecenie OP? oraz 4)exec
dwukrotne użycie powoduje utratę wszelkich zmian środowiska dokonanych w początkowej powłoce zsh, co nie zdarzyłoby się, gdybyś po prostu wywołał bash.