Rozszerzenia plików dla skryptów powłoki unix [zamknięte]


45

W Wikipedii artykuł dla .sh mówi:

Typ rozszerzenia pliku .sh znajduje się w powłoce Bourne'a .

A co z innymi powłokami unixowymi?

Wiem, że shebang jest używany w pliku do wskazania interpretera do wykonania, ale zastanawiam się:

  • Jakie są zalety i wady rozszerzeń plików w porównaniu z brakiem rozszerzeń plików?

4
Czasami można znaleźć skrypty powłoki bez shebang (lub bez uprawnień do wykonywania). W takim przypadku nazwa kończąca się na .sh może być wskazówką dla użytkownika, aby je uruchomić bash script.sh(lub shoczywiście).
Ansgar Esztermann

3
Jeśli skrypt powłoki ma rozszerzenie, zwykle jest to plik .sh. Nigdy nie widziałem skryptu .ksh ani .bash. Jednak większość skryptów powłoki nie ma rozszerzenia, jak na przykład wszystkie skrypty w /etc/init.d/*.
Richard Holloway,

Chociaż uproszczony wniosek (tak lub nie) jest opinią, rzeczy do rozważenia nie są.
ctrl-alt-delor

Odpowiedzi:


35

Nazwałbym tylko .shcoś, co ma być przenośne (i mam nadzieję, że jest przenośne).

W przeciwnym razie myślę, że po prostu lepiej jest ukryć język. Uważny czytelnik i tak znajdzie go w linii shebang. (W praktyce .bashlub .zsh, etc ... przyrostki są rzadko stosowane).


1
Tylko z tej strony możemy już zobaczyć dość nietypową liczbę osób, które z niej korzystają. Dlaczego mówisz, że są „rzadko używane”? Jakieś cytaty? Czy jest to oparte wyłącznie na twoim doświadczeniu?
Pacerier

23

Powiedziałbym, że nie istnieją „dobre praktyki” dla rozszerzeń plików, ściśle rzecz biorąc: systemy plików Unix / Linux / * BSD same w sobie nie obsługują rozszerzeń. To, co nazywasz rozszerzeniem, jest jedynie przyrostkiem pojedynczej nazwy pliku. Różni się to od systemów plików i systemów operacyjnych VM / CMS, VMS, MS-DOS i Windows, w których specjalne rozszerzenie w ekwipunku moralnym i-węzła jest zarezerwowane dla rozszerzenia.

Ten mały rant się skończył, myślę, że głupotą jest wstawienie sufiksu „.sh”, „.ksh” lub „.bash” w nazwie pliku skryptu powłoki. Program jest programem: nie ma korzyści w rozróżnieniu tego, co zostanie wykonane. Żaden unix, linux ani żadne inne jądro nie zdecydowało się na wywołanie interpretera w niektórych plikach tylko z powodu przyrostka nazwy pliku. Wszystko to odbywa się przez #!linię lub inną sekwencję bajtów na początku pliku. W rzeczywistości decyzja o tym, co należy wykonać na podstawie „rozszerzenia” nazwy pliku, jest jednym z czynników, które sprawiają, że Windows jest magnesem szkodliwego oprogramowania. Sprawdź, ile oszustw związanych ze złośliwym oprogramowaniem w systemie Windows dotyczy pliku o nazwie „coś.jpg.exe” - domyślnie nowsze Windows nie wyświetlają rozszerzenia „.exe” i zachęć użytkownika do dwukrotnego kliknięcia „

To, co możesz uznać za bezpośrednie polecenie, jest często skryptem powłoki. Czasami ccbył skryptem firefoxsh, skryptem startxsh, skryptem sh. Nie sądzę, aby oznaczanie skryptu za pomocą przyrostka „.sh” wiązało się z korzyściami poznawczymi lub organizacyjnymi.


24
Nie zgadzam się! Moje zadanie polega na pakowaniu aplikacji zawierającej tysiące plików, od binarnych plików wykonywalnych po skrypty powłoki (ksh, bash i niektóre starsze pliki csh). Dla mnie, proszę mi wierzyć, że robi coś zmienić, aby być w stanie poznać w skrócie (lub w regex), jaki rodzaj pliku mówimy i szukamy. Chodzi mi o to, że rozróżnienie tego, co się ekscytuje, może być korzystne, a najlepsza praktyka powinna zachęcać do wyraźnego podawania rodzaju pliku.
rahmu

4
@rahmu: napisz to jako odpowiedź. Podaj kilka szczegółów na temat tego, w jaki sposób nazwy rozróżnialne przez wyrażenia regularne pomagają spakować (i być może utrzymać) tę aplikację. Zwróć uwagę na interakcję między tym, co interpretuje plik i sufiks nazwy pliku, a tym, jak to pomaga w wykonywaniu zadań. Interesują mnie poważne argumenty przeciwko mojemu punktowi widzenia i jestem skłonny się zmienić, jeśli jestem przekonany. Głosowałem za twoim komentarzem, aby to udowodnić.
Bruce Ediger,

3
Chciałbym, niestety, mogę jedynie mówić o moim obecnym doświadczeniu w mojej obecnej pracy. Niewiele wiem o dobrych praktykach i ogólnie standardach ; Wydaje mi się, że powinienem przeprowadzić badania, zanim opublikuję tutaj odpowiedź.
Zajrzę

2
@rahmu Istnieje polecenie „file” służące do określania typu pliku. Jest w stanie odróżnić skrypty napisane dla różnych powłok.
Matt

3
Jeśli podasz .shrozszerzenie powłoki , będziesz musiał wpisać je .shjako część nazwy polecenia podczas jego uruchamiania. To jest główny powód, dla którego nie lubię umieszczać tego rozszerzenia (to samo z czymkolwiek mającym linię shebang). BTW, problemem w systemie Windows nie jest sam .exeprzedrostek (w końcu stworzenie pliku wykonywalnego o nazwie image.jpgw Linuksie jest trywialny ), ale fakt, że Windows zwykle ukrywa to rozszerzenie, w połączeniu z faktem, że akcja wymagała uruchomienia pliku wykonywalnego i otwarcie dokumentu jest dokładnie takie samo.
celtschk

12

Jako ten, który pracował w wielu różnych środowiskach, musiałem pisać w wielu różnych powłokach. Wierzcie lub nie, na różnych platformach pociski nie są takie same. Więc jeśli przechowujesz swoją osobistą bibliotekę w wielu powłokach (w razie potrzeby), bardzo pomocne jest użycie rozszerzeń do identyfikacji powłok. W ten sposób, kiedy przechodzisz na inną platformę i powłoka jest nieco inna, wiesz, jakie skrypty mają być modyfikowane. .sh .ksh .bsh .csh ...


Wydaje się, że zgadza się to z unix.stackexchange.com/questions/31760/…
Pacerier

Czy nie masz #!na początku skryptu (np. #!/bin/bash)?
ctrl-alt-delor

Gnu / Linux, BSD i UNIX są uniksowe. Nie ma potrzeby używania nix. Linux jest jądrem, Android używał Linuksa, ale nie jest Uniksem (chyba że dodasz dodatkowe oprogramowanie, w którym to przypadku masz aplikację Unix).
ctrl-alt-delor

@ ctrl-alt-delor: „Unix” jest znakiem towarowym . Ludzie często używają „? Nix”, aby uniknąć problemu ze znakiem towarowym (i pedantów).
JS.

@JS `UNIX 'jest znakiem towarowym The Open Group. Unix i unix nie są greens.org/about/unix.html
ctrl-alt-delor

5

Jak już powiedziałeś, rozszerzenia plików Uniksa są czysto informacyjne. Potrzebujesz tylko skryptu, aby mieć poprawny shebang i być wykonywalny.

Możesz nie mieć rozszerzenia lub używać .sh.

Osobiście używam następujących konwencji, niezależnie od użytej powłoki (csh, tcsh, bash, sh, ...):

  • brak rozszerzenia dla skryptów systemowych lub wysokiej jakości (niezwykle rzadkie).
  • .shskryptów klasycznych, od niskiej do wysokiej klasy.

Co rozumiesz przez „klasyczne skrypty od niskiej do wysokiej”?
Pacerier

Myślę, że chodziło mi o poziom abstrakcji lub poziom organizacji. Oznacza to, że nie obchodzi Cię, jakiego języka / skryptu używasz za niektórymi poleceniami: więc nie używasz żadnego rozszerzenia. Dla innych dobrze jest wiedzieć, że jest to bash lub jakiś egzotyczny skrypt powłoki ksh (z odpowiednim rozszerzeniem). ... ale to było 2 lata temu;)
Ouki

5

Nie powinieneś używać rozszerzenia dla plików wykonywalnych, ponieważ nie są one wymienne. Wyobraź sobie, że masz skrypt powłoki a.sh, a następnie ponownie napisz w pythonie a.py, teraz musisz zmienić każdy program, który nazywa cię skryptem, masz wyciek informacji o implementacji.

Całe rozszerzenie nazwy pliku w systemie Windows Mircosoft to bałagan: na przykład to, co mogło być a.audio, b.audio, c.audio, jest a.mp3, b.wav, c.oggi d.picture, e.picture, f.picturejest d.jpeg, e.png, f.gif. Przez większość czasu nie dbamy o to, w jakim formacie jest dźwięk lub obraz. Musimy też dużo czasu uczyć nowych użytkowników wszystkich rozszerzeń plików.


Innym powodem, dla którego nie korzystałem, na *.shktóry właśnie wpadłem, jest to, że Debian run-partsnie będzie uruchamiał skryptów z rozszerzeniami, takich jak /etc/cron.*/: archive.oreilly.com/pub/post/runparts_scripts_a_note_about.html
Ross Patterson

3

Rozszerzenia skryptów powłoki są bardzo przydatne. Na przykład często piszę skrypty, które mają wiele plików w wielu językach (np. Bash, awk i lua) w tym samym katalogu. Jeśli muszę szukać ciągu tylko w plikach bash, rozszerzenie czyni to bardzo przydatnym, aby zmniejszyć liczbę fałszywych alarmów. Lub jeśli chcę zrobić liczbę wierszy całego mojego kodu bash dla tego projektu.

Trudno jest wpisać rozszerzenie podczas uruchamiania programu, dlatego też tworzę dowiązanie symboliczne bez rozszerzenia do głównego pliku wykonywalnego, aby je edytować / uruchamiać bez konieczności każdorazowego wpisywania rozszerzenia. Dowiązania symboliczne są tanie i łatwe.


Wydaje się, że zgadza się to z unix.stackexchange.com/questions/31760/…
Pacerier

2

Jak powiedzieli inni, powłoka nie dba o rozszerzenia. Pozwala to jednak na szybką identyfikację plików przez ludzi. Widzę pliki z rozszerzeniem .pylub .shszybko wiem, jakie powinny one być. Jak mówi Steve, wyszukiwanie według rozszerzenia pliku lub liczenie linii to również względy praktyczne.

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.