shopt działa w wierszu poleceń, nie można go znaleźć po uruchomieniu w skrypcie

13

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 dotglobbezpoś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?

Kurtosis
źródło
Dziękuję za przypomnienie, wybrałem wszystkie odpowiedzi na wszystkie moje pytania. Oprócz tego pytania jeszcze nie ma dobrej odpowiedzi.
Kurtosis
3
Spróbuj z prostszym #!/bin/bashnagłówkiem?
ish
A która wersja Ubuntu?
ish
2
@izx, to właściwa odpowiedź, shoptjest wbudowanym bashem, shnie ma go shopt, a komunikat o błędzie wygląda jak komunikat o błędzie z dash. Najprawdopodobniej więc tutaj błąd polega na uruchomieniu skryptu bash sh(który jest dashdomyślnie w Ubuntu ). Nawet jeśli shjest dowiązaniem symbolicznym bash, uruchomienie skryptu bash shnie jest tym samym, co uruchomienie go bash.
geirha

Odpowiedzi:

23

Aby udzielić odpowiedzi na podstawie komentarzy:

Wiele osób z przyzwyczajenia uruchamia swoje skrypty shzamiast bash. 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:

#!/bin/bash

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.

Scott Severance
źródło
5
Wolę być całkowicie międzysystemowy, wolę: #!/usr/bin/env bash ponieważ zadaniem env jest wiedzieć, której bash użyć (na przykład, jeśli ją załatałeś).
shrikeh
-1

Musisz wyjść z zsh i aktywować bash, jak pokazano:

exec bash

Uruchom polecenie

source ~/.bashrc

Po czym możesz reaktywować Zsh:

exec zsh

Mam nadzieję, że to pomaga

David Kabii
źródło
Hmmm. 1) Nie sądzę, aby OP używał zsh, 2) AFAIK ~/.basrcjest 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) execdwukrotne 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.
ksenoid
W moim przypadku konieczne było wychwycenie zmian środowiska i zmiany nie uległy zmianie. Właśnie zrestartowałem komputer i wszystkie moje zmiany są zachowane. Być może jest to jednak specyficzne dla anakondy, którą próbowałem ustawić
David Kabii,