Używasz rozszerzenia .sh lub .bash dla skryptów bash?


36

(Zobacz Użyj #! / Bin / sh lub #! / Bin / bash w celu uzyskania zgodności z Ubuntu-OSX oraz łatwości użytkowania i POSIX )

Jeśli chcę, aby moje skrypty korzystały z powłoki bash, to czy użycie rozszerzenia .bash faktycznie wywołuje bash, czy też zależy to od systemu config / 1st shebang. Gdyby oba były skuteczne, ale różne, co miałoby pierwszeństwo?

Nie jestem pewien, czy zakończyć moje skrypty za pomocą .sh, aby po prostu wskazać „skrypt powłoki”, a następnie pozwolić, aby pierwszy wiersz wybrał powłokę bash (np. #!/usr/bin/env bash), Czy też po prostu zakończyć je za pomocą .bash (a także ustawienia linii 1 ). Chcę wywołać bash.


3
Nie sądzę, żebym kiedykolwiek widział .bashrozszerzenie. Ponadto zasadą Debiana jest posiadanie skryptów w pakietach, które lądują w jednym z binfolderów, aby nie mieć rozszerzeń.
muru

Odpowiedzi:


19

robi użycie rozszerzenia .bash faktycznie wywołuje bash, czy też zależy to od systemu config / 1st shebang.

Jeśli nie używasz interpretera jawnie, to wywoływany interpreter jest określany przez shebangużycie w skrypcie. Jeśli korzystasz z interpretera, to tłumacz nie dba o to, jakie rozszerzenie dajesz skryptowi. Jednak rozszerzenie istnieje, aby dla innych było bardzo oczywiste, jaki to rodzaj skryptu.

[sreeraj@server ~]$ cat ./ext.py
#!/bin/bash
echo "Hi. I am a bash script"

Zobacz, .pyrozszerzenie do skryptu bash nie czyni go skryptem Pythona.

[sreeraj@server ~]$ python ./ext.py
  File "./ext.py", line 2
    echo "Hi. I am a bash script"
                                ^
SyntaxError: invalid syntax

To zawsze bashskrypt.

[sreeraj@server ~]$ ./ext.py
Hi. I am a bash script

23

Nazywanie skryptu nie ma nic wspólnego z jego uruchomieniem.

Linia shebang określa, jakiego interpretera używa się do uruchomienia skryptu.

Osobiście nie dbam o to, czy skrypt to sh, bash, perl, cokolwiek, więc po prostu nazywam go tym, co robi; Uważam, że dodanie rozszerzenia jest zbędne. Zrobię, file scriptnameaby dowiedzieć się, co to jest plik, jeśli chcę to wiedzieć.

Jeśli więc chcesz, aby skrypt był uruchamiany bash, użyj #!/bin/bashjako pierwszego wiersza.


4
Ponadto, jeśli wybór implementacji skryptu kiedykolwiek się zmieni (powiedzmy, że został przepisany w Pythonie, Perlu, C ...), brak .shrozszerzenia stylu oznacza, że ​​nie trzeba zmieniać jego nazwy. (Trzeba przyznać, że nic nie stoi na przeszkodzie, aby program C produkujący plik binarny z .shrozszerzeniem byłby mylący.)
Stephen Kitt

2
Użycie #!/usr/bin/env bashdla przenośności, omówione tutaj stackoverflow.com/a/10383546/54964
Léo Léopold Hertz

4
@wurtel (spóźniony komentarz, OK?) Dodanie rozszerzenia imho nie jest zbyteczne. Większość edytorów obsługuje podświetlanie składni na podstawie rozszerzenia, a ponadto sensowna jest natychmiastowa widoczność typu pliku. Jasność i czytelność mają duże znaczenie.
RolfBly

@RolfBly: Używane przeze mnie edytory rozpoznają shebang i zapewniają podświetlanie składni. Klarowność jest przydatna, ale przez większość czasu chcemy wykonać polecenie i dobrze, jeśli muszę mniej pisać i jeśli nie muszę pamiętać jego języka implementacji.
Hontvári Levente
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.