Napisałem skrypt bash w edytorze tekstu, jakie rozszerzenie mam zapisać mój skrypt, aby mógł działać jako skrypt bash? Stworzyłem skrypt, który teoretycznie powinien uruchomić serwer ssh. Zastanawiam się, jak sprawić, by skrypt wykonywał się po kliknięciu. Używam systemu OS X 10.9.5.
84
bash myscript
.sh
, ale rozszerzenie nie musi w ogóle istnieć. Linux to nie Windows. Program, który ma zinterpretować twój skrypt, jest określony w jego pierwszej linii, tak powinno być#!/bin/bash
. Może nawet zawierać parametry.#!/bin/bash
.Odpowiedzi:
Nie zgadzając się z innymi odpowiedziami, istnieje powszechna konwencja używania
.sh
rozszerzenia dla skryptów powłoki - ale nie jest to przydatna konwencja. Lepiej w ogóle nie używać rozszerzenia. Zaleta możliwości stwierdzenia, żefoo.sh
jest to skrypt powłoki ze względu na jego nazwę, jest minimalna, a płacisz za to utratą elastyczności.Aby skrypt bash był wykonywalny, musi mieć na górze linię shebang :
#!/bin/bash
i użyj
chmod +x
polecenia, aby system rozpoznał go jako plik wykonywalny. Następnie należy go zainstalować w jednym z katalogów wymienionych w pliku$PATH
. Jeśli skrypt zostanie wywołanyfoo
, możesz go uruchomić z wiersza poleceń powłoki, wpisującfoo
. Lub jeśli znajduje się w bieżącym katalogu (typowym dla skryptów tymczasowych), możesz wpisać./foo
.Ani powłoka, ani system operacyjny nie zwracają uwagi na rozszerzenie nazwy pliku. To tylko część nazwy. A nie dając mu specjalnego rozszerzenia, zapewniasz, że każdy (użytkownik lub inny skrypt), który go używa, nie musi dbać o to, jak został zaimplementowany, czy jest to skrypt powłoki (sh, bash, csh, czy cokolwiek) , skrypt Perla, Pythona lub Awk albo binarny plik wykonywalny. System jest specjalnie zaprojektowany, aby można było wywołać skrypt zinterpretowany lub plik wykonywalny binarny bez znajomości lub dbałości o sposób jego zaimplementowania.
Systemy podobne do UNIX zaczynały od czysto tekstowego interfejsu wiersza poleceń. GUI, takie jak KDE i Gnome, zostały dodane później. W systemie graficznym z interfejsem użytkownika zazwyczaj można uruchomić program (ponownie, niezależnie od tego, czy jest to skrypt, czy binarny plik wykonywalny), na przykład dwukrotnie klikając ikonę, która się do niego odnosi. Zwykle powoduje to odrzucenie wszystkich danych wyjściowych, które program może wydrukować, i nie pozwala na przekazywanie argumentów wiersza poleceń; jest znacznie mniej elastyczny niż uruchamianie go z zachęty powłoki. Ale w przypadku niektórych programów (głównie klientów GUI) może to być wygodniejsze.
Skryptów powłoki najlepiej się nauczyć z wiersza poleceń, a nie z graficznego interfejsu użytkownika.
(Niektóre narzędzia zrobić zwrócić uwagę na rozszerzeniach Na przykład kompilatory zazwyczaj używają rozszerzenia w celu określenia języka kod jest napisany w.
.c
Dla C.cpp
. Dla C ++, itp Konwencja ta nie ma zastosowania do plików wykonywalnych)Należy pamiętać, że UNIX (i systemy podobne do UNIX) to nie Windows. MS Windows na ogół używa rozszerzenia pliku, aby określić, jak go otworzyć / wykonać. Binarne pliki wykonywalne muszą mieć
.exe
rozszerzenie. Jeśli masz powłokę podobną do systemu UNIX zainstalowaną w systemie Windows, możesz skonfigurować system Windows tak, aby rozpoznawał.sh
rozszerzenie jako skrypt powłoki i używać powłoki do otwierania go; Windows nie ma#!
konwencji.źródło
deploy.sh
(lubdeploy.bash
) i folderdeploy
z dodatkową logiką wdrażania. Jeśli zmienisz nazwę skryptu na prostądeploy
, spowoduje to konflikt nazw. Nazywanie plików lub folderów w inny sposób utrudnia zarządzanie i prawdopodobnie sortowanie plików (ls
w edytorach itp.). Oczywiście shebang jest - ostatecznie - wyznacznikiem. Ale rozszerzenia plików mają swoje właściwe miejsce.Deploy
, chociaż może to powodować problemy podczas kopiowania do systemu plików bez rozróżniania wielkości liter..sh
rozszerzenia, aby skrypt otwierał się w wybranym edytorze. Jeśli chcesz uruchomić skrypt po dwukrotnym kliknięciu, nadaj mu.command
rozszerzenie, a po dwukrotnym kliknięciu uruchomi się w Terminalu.Nie potrzebujesz żadnego rozszerzenia (lub możesz wybrać dowolne, ale
.sh
jest to przydatna konwencja).Powinieneś rozpocząć skrypt od
#!/bin/bash
(ta pierwsza linia jest rozumiana przez execve (2) syscall) i powinieneś uczynić swój plik wykonywalnym przezchmod u+x
. więc jeśli twój skrypt jest w jakimś pliku$HOME/somedir/somescriptname.sh
, musisz wpisać go razchmod u+x $HOME/somedir/somescriptname.sh
w terminalu. Zobacz chmod (1) dla polecenia i chmod (2) dla syscall.
O ile nie wpisujesz całej ścieżki do pliku, powinieneś umieścić ten plik w jakimś katalogu wymienionym w twoim
PATH
(zobacz environment (7) i execvp (3) ), który możesz ustawić na stałe w swoim,~/.bashrc
jeśli twoja powłoka logowania jestbash
)Przy okazji, możesz napisać swój skrypt w jakimś innym języku, np. W Pythonie, zaczynając go za pomocą
#!/usr/bin/python
, lub w Ocaml, zaczynając od#!/usr/bin/ocaml
...Wykonywanie skryptu przez dwukrotne kliknięcie (na co? Nie powiedziałeś!) To problem ze środowiskiem graficznym i może być specyficzny dla pulpitu (może być inny w przypadku Kde, Mate, Gnome, .... lub IceWM lub RatPoison). Być może przeczytanie specyfikacji EWMH pomoże ci uzyskać lepszy obraz.
Być może uczynienie skryptu wykonywalnym za pomocą
chmod
może sprawić, że będzie można go kliknąć na pulpicie (najwyraźniej Quartz na MacOSX). Ale wtedy prawdopodobnie powinieneś sprawić, by dawał wizualną informację zwrotną.A kilka komputerów nie ma żadnego pulpitu, w tym własnego, gdy uzyskujesz do niego dostęp zdalnie za pomocą ssh .
Uważam, że uruchamianie skryptu powłoki przez kliknięcie nie jest dobrym pomysłem. Prawdopodobnie chcesz mieć możliwość podania argumentów do swojego skryptu powłoki (i jak byś to zrobił, klikając?) I powinieneś przejmować się jego wynikami. Jeśli jesteś w stanie napisać skrypt powłoki, możesz użyć interaktywnej powłoki w terminalu. Że to najlepszy i najbardziej naturalny sposób wykorzystania skryptu. Dobre interaktywne powłoki (np. Zsh lub fish lub być może niedawne
bash
) mają pyszne i konfigurowalne funkcje autouzupełniania i nie będziesz musiał dużo pisać (naucz się używać tabklawisza klawiatury). Ponadto skrypty i programy są często częściami poleceń złożonych (potoki itp.).PS. Używam Uniksa od 1986 roku, a Linuksa od 1993 roku. Nigdy nie uruchamiałem własnych programów ani skryptów, klikając. Dlaczego powinienem?
źródło
chmod +x
raczej niżchmod u+x
, chyba że istnieje konkretny powód, aby ograniczyć wykonywanie do właściciela.po prostu
.sh
.Uruchom skrypt w następujący sposób:
EDYCJA: Jak powiedział anubhava, rozszerzenie tak naprawdę nie ma znaczenia. Jednak ze względów organizacyjnych nadal zaleca się używanie rozszerzeń.
źródło
.sh
sufiksu do wykonywalnego skryptu jest generalnie bezużytecznym bałaganem..sh
rozszerzeniem (i mniej z.bash
rozszerzeniem), ale nie jestem przekonany, że jest to w ogóle przydatne. Jeślifoo.sh
nadam skryptowi nazwę, a później zdecyduję się ponownie zaimplementować go w Perlu, mogę albo zmienić nazwę (i edytować wszystko, co go używa), albo zostawić wprowadzające w błąd rozszerzenie. Jeśli nadam nazwęfoo
, nie mam tego problemu.head -1 script.foo
lubfile script.foo
). Ale jeśli wszystko jest poprawnie zainstalowane i skonfigurowane, w 99% przypadków chcę, aby polecenie wykonało to, co powinno. Dla mnie to nie uzasadnia konieczności bycia świadomym przyrostka.py
lub.bash
przyrostka za każdym razem, gdy go uruchamiam.Wiem, że to jest teraz dość stare, ale czuję, że to dodaje do tego, o co pytano.
Jeśli używasz komputera Mac i chcesz mieć możliwość uruchomienia skryptu, klikając go dwukrotnie, musisz użyć
.command
rozszerzenia. Również tak samo jak wcześniej, aby plik był wykonywalny zchmod -x
.Jak wspomniano wcześniej, nie jest to aż tak przydatne.
źródło
TL; DR - Jeśli użytkownik (niekoniecznie twórca) skryptu używa interfejsu GUI, zależy to od używanej przeglądarki plików. Finder MacOS będzie wymagał
.sh
rozszerzenia w celu wykonania skryptu. Gnome Nautilus rozpoznaje jednak poprawnie wykonane skrypty z.sh
rozszerzeniem lub bez niego .Wiem, że wielokrotnie mówiono o powodach za i przeciw używaniu rozszerzeń w skryptach bash, ale nie tak bardzo, dlaczego lub dlaczego nie używać rozszerzeń, ale mam to, co uważam za dobrą zasadę.
Jeśli jesteś typem, który wskakuje do basha i wychodzi z niego i ogólnie używasz terminala lub tworzysz narzędzie dla kogoś, kto nie używa terminala, dodaj
.sh
rozszerzenie do swoich skryptów bash. W ten sposób użytkownicy tego skryptu mają możliwość dwukrotnego kliknięcia tego pliku w przeglądarce plików GUI w celu uruchomienia skryptu.Jeśli jesteś typem, który głównie wykonuje całą lub większość swojej pracy w terminalu, nie przejmuj się dodawaniem żadnych rozszerzeń do swoich skryptów bash. Nie służyłyby one żadnemu celowi w terminalu, zakładając, że już skonfigurowałeś swój
~/.bashrc
plik, aby wizualnie odróżniać skrypty od katalogów.Edytować:
W przeglądarce plików Gnome Nautilus z 4 plikami testowymi (każdy z uprawnieniami do wykonania pliku) z głupio prostym poleceniem bash otwierającym okno terminala (
gnome-terminal
):Plik bez rozszerzenia z
#!/bin/bash
w pierwszym wierszu.Zadziałało poprzez dwukrotne kliknięcie pliku.
Plik z
.sh
rozszerzeniem z#!/bin/bash
w pierwszym wierszu.Zadziałało poprzez dwukrotne kliknięcie pliku.
Plik bez rozszerzenia z NO
#!/bin/bash
w pierwszym wierszu.Zadziałało po dwukrotnym kliknięciu pliku ... technicznie, ale GUI nie wskazywało, że był to skrypt powłoki. Mówiło się, że to zwykły plik tekstowy.
Plik z
.sh
rozszerzeniem z NO#!/bin/bash
w pierwszym wierszu.Zadziałało poprzez dwukrotne kliknięcie pliku.
Jednak, jak mądrze zauważył Keith Thompson w komentarzach do tej odpowiedzi, poleganie na używaniu
.sh
rozszerzenia zamiast bash shebang w pierwszej linii pliku (#!/bin/bash
) może powodować problemy.Innym jednak, pamiętam, kiedy wcześniej korzystałem z MacOS, że nawet poprawnie działała (czy to słowo?) Skrypty bash bez
.sh
rozszerzenia nie mogły być uruchamiane z GUI na MacOS. Chciałbym jednak, żeby ktoś poprawił mnie w komentarzach. Jeśli to prawda, udowodniłoby, że istnieje co najmniej jedna przeglądarka plików, w której.sh
rozszerzenie ma znaczenie.źródło
.sh
sufiksem#!/bin/bash
w pierwszym wierszu, czy przeglądarka plików GUI będzie go używaćsh
do wywołania (ignorując shebang)? Jeśli tak, może to spowodować pewne problemy. (Odpowiedź może być inna dla różnych przeglądarek.)/bin/bash
lub/bin/sh
(ten drugi jest domyślny dla skryptu bez shebang). Jeśli/bin/sh
jest dowiązaniem symbolicznym do/bin/bash
(co jest dość powszechne), możesz to stwierdzić, patrząc na wartość$0
. (Ponadto, jeśli bash jest wywoływany taksh
, jak ustawiaPOSIXLY_CORRECT=y
.)