W moim katalogu $ HOME / bin mam kilka ręcznie wykonywanych skryptów wykonywalnych. Niektóre są napisane bash, niektóre w Ruby. Wszystkie mają na górze linię shebang, która mówi powłoce, jakiego interpretera użyć (w moim przypadku bash lub Ruby).
Zastanawiam się, czy lepiej umieścić rozszerzenia plików na tych skryptach, aby wskazać, w jakim języku skryptowym są one napisane? Na przykład skrypty w języku Ruby miałyby przyrostek * .rb, a skrypty bash miałyby przyrostek * .sh.
Obecnie skrypty te mają proste nazwy bez rozszerzenia pliku.
Jaka jest najlepsza praktyka?
bash
script
shell-script
Dan
źródło
źródło
Odpowiedzi:
Możesz wykonywać polecenia wieloznaczne, takie jak
ls *.rb
lubcp *.sh
jeśli chcesz organizować skrypty w przyszłości.Moim zdaniem zacznij wcześnie lub później żałuj.
Edytorzy, tacy jak,
vim
będą mogli zastosować poprawne podświetlanie składni na podstawie shebang lub rozszerzenia pliku.Można to również osiągnąć, używając modelin w różnych edytorach. Np. Dla vima:
źródło
Cóż - jak większość rzeczy w życiu: zależy od twoich potrzeb.
Stwierdziłeś, że te skrypty znajdują się w katalogu bin i zakładam, że te skrypty mają być wywoływane z wiersza poleceń. Jako użytkownik uważam to za irytujące, jeśli muszę wpisać bla.ksh lub foo.bash. Również jeśli programista zdecyduje się przenieść na inny interpreter, nazwa polecenia również się zmieni i będę musiał zmienić inne skrypty korzystające z tych narzędzi - bardzo denerwujące, nawet jeśli użytkownik i programista są tą samą osobą.
Z drugiej strony w katalogach kompilacji projektu używam rozszerzeń takich jak .sh lub .tcl. W ten sposób mogę korzystać z funkcji make do wdrażania plików w ich katalogach docelowych - ale na tym etapie usuwam sufiks pliku.
źródło
Oczywiście istnieją pewne różnice między plikami wykonywalnymi w
bin
katalogach a edytowalnymi plikami „źródłowymi”.#!
linii..pm
,.sh
czy.so
w takich przypadkach.W przypadku skompilowanego programu różnica między „źródłowym” a „wykonywalnym” jest oczywista: jeden zawiera kod źródłowy, drugi zawiera język maszynowy lub interpretowany kod bajtowy. W przypadku skryptu nie ma oczywistej różnicy, ale
make
polecenie utrzymuje hipotetyczną separację między „kodem źródłowym skryptu” a „wykonalną wersją skryptu”: jego domyślny „kompilator” dla „skryptu powłoki” jest po prostucp
.Polecam prowadzenie osobnego
$HOME/source
katalogu i:ln -s ../source/foo.sh $HOME/bin/foo
; lubinstall -m 755 foo.sh ../bin/foo
; lubMakefile
reguły, aby wykonać kontrolę składni przed skopiowaniem pliku źródłowego$HOME/source
do$HOME/bin
Przypis: powłoka moduł skrypt jest użyteczny tylko przez inny skrypt powłoki i modyfikuje wewnętrzny kontekst tego skryptu przy użyciu
.
lubsource
wbudowanych komend. Różni się to od skryptu wykonywalnego, który (jak każdy program) działa jako osobny proces i nie może modyfikować swojego procesu nadrzędnego. Z grubsza konwencja, moduły wchodzą,/usr/lib/name_of_program/name_of_module.sh
a polecenia wchodzą/usr/bin/name_of_command
(bez żadnego przyrostka).źródło
To nie jest konieczne. Jądro jest już informowane o poprawnym interpretatorze (przy pomocy
#!
wiersza), a wszystkie popularne edytory tekstu również go czytają, więc dodanie rozszerzenia nie zrobiłoby nic użytecznego, tylko zwiększyłoby pisanie. Jedynym przypadkiem, gdy program wykonywalny ma rozszerzenie, jest to, że jest ono w jakiś sposób ważne (dla programu, użytkownika lub obu).Z drugiej strony moduły i biblioteki prawie zawsze mają rozszerzenia (
.rb
dla modułów Ruby,.so
dla bibliotek współdzielonych ELF i tak dalej).źródło