Pracowałem nad skryptem, który automatyzuje konfigurowanie środowiska programistycznego do programowania Raspberry Pi (szczegóły krok po kroku, które działają tutaj ). Skrypt znajduje się w tym artykule, ale dla wygody można go również znaleźć tutaj . Teraz po uruchomieniu tego skryptu zainstaluj i skonfiguruj środowisko bez błędów, ale musisz wpisać hasło sudo więcej niż raz z powodu domyślnej wartości limitu czasu sudo. Zacząłem więc eksperymentować, usuwając wszystkie wiersze sudo i uruchamiając cały skrypt za pośrednictwem sudo w wierszu poleceń, tak jak poniżej:
kemra102@ubuntuvm:~$ sudo ./pi_dev_env_install.sh
Działa to zgodnie z oczekiwaniami i przechodzi przez większość tego momentu:
./pi_dev_env_install: 68: ./pi_dev_env_install.sh: Syntax error: "(" unexpected
Teraz ta linia działała poprzednio dobrze, gdy nie działał cały skrypt z sudo. Nie ma nic w tej linii działającej jako sudo, która powinna przestać działać zgodnie z moją wiedzą, czy ktoś ma jakieś pomysły?
źródło
dash
zamiastbash
. Spróbuj przesunąć shebang w linii 1.Odpowiedzi:
Skrypt nie zaczyna się od linii shebang , więc system wykonuje go
/bin/sh
. Na Ubuntu,/bin/sh
jest dash , powłoka przeznaczona do szybkiego uruchamiania i wykonywania z tylko standardowymi funkcjami. Kiedy myślnik osiąga linię 68, widzi błąd składniowy: ten nawias nic dla niego nie znaczy w kontekście.Ponieważ myślnik (podobnie jak wszystkie inne powłoki) jest tłumaczem, nie będzie narzekał, dopóki wykonanie nie osiągnie linii problematycznej. Nawet jeśli skrypt pomyślnie uruchomi się w którymś momencie testowania, zostanie przerwany po osiągnięciu linii 68.
Linia shebang musi być pierwszą rzeczą w pliku. Ponieważ używasz funkcji bash, pierwszą linią pliku musi być
#!/bin/bash
lub#!/usr/bin/env bash
.źródło
sonarqube.sh
Ubuntu 15.10. Zmieniono nagłówek, jak powiedziano. Wykonywaniesudo sh ./sonar.sh console
. Nadal pojawia się błąd.sonarqube.sh
orsonar.sh
? Uzupełnić swój umysł. W każdym razie, jeśli nie możesz rozwiązać problemu z informacjami w tym wątku, zadaj nowe pytanie z pełną zawartością skryptu i skopiuj i wklej pełne komunikaty o błędach.#! /bin/sh
doskonale wykonanego. To mnie dziwi.Jeśli shebang nie znajduje się w pierwszym wierszu, nie będzie przestrzegany, niezależnie od powłoki użytkownika root,
SHELL
zmiennej lub-s
flagi. Możesz to łatwo potwierdzić za pomocą prostego przykładu:Uruchomienie tego skryptu z sudo spowoduje błąd składniowy w najnowszych wersjach Ubuntu i Debian.
Masz dwie opcje, aby upewnić się, że skrypt jest interpretowany przez
bash
:Przenieś shebang do pierwszej linii
Uruchom
sudo
tak:źródło
Dla mnie rozpoczęcie skryptu z:
działa w porządku.
źródło
Może masz „(”) w nazwie katalogu lub pliku.
źródło
Wypróbuj dos2unix w pliku skryptu. Czasami w źródle są ukryte postacie.
Komenda:
źródło
Może się to zdarzyć, jeśli zastąpisz zamierzonego tłumacza. Np. Będzie działał z sh niezależnie od użytego hash bang (przydatne, gdy nie używasz hash bang):
LUB, aby uruchomić bash:
Aby umożliwić mu użycie zdefiniowanej przez skrypt wartości hash bang, użyj tego:
źródło
W moim przypadku błędem był brak uprawnień do wykonania pliku. Komunikat o błędzie pojawił się tylko wtedy, gdy rozdzieliłem polecenia:
źródło