Jak uruchomić skrypt powłoki w OS X, klikając dwukrotnie?

233

Mam skrypt powłoki, który ma uprawnienia do wykonywania przez użytkownika w systemie OS X, ale po dwukrotnym kliknięciu otwiera się w edytorze tekstu. Jak mogę go uruchomić, klikając go dwukrotnie?

c2h2
źródło

Odpowiedzi:

266
  • Najpierw w terminalu włącz skrypt do wykonania, wpisując:

    chmod a+x (yourscriptname)
  • Następnie w Finderze kliknij plik prawym przyciskiem myszy i wybierz „Otwórz za pomocą”, a następnie „Inne ...”.

  • Tutaj wybierz aplikację, w której chcesz uruchomić plik, w tym przypadku będzie to Terminal. Aby móc wybrać terminal, musisz przełączyć z „Zalecanych aplikacji” na „Wszystkie aplikacje”. (Aplikacja Terminal.app znajduje się w folderze Narzędzia)

  • UWAGA: chyba że nie chcesz powiązać wszystkich plików z tym rozszerzeniem, które mają być uruchamiane w terminalu, nie powinieneś zaznaczać opcji „Zawsze otwieraj z”.

  • Po kliknięciu OK powinieneś być w stanie wykonać swój skrypt, po prostu klikając go dwukrotnie.
Lus
źródło
dzięki, rozumiem, nie wiedziałem, że mogę powiązać z terminalem. Pomyślałem, że muszę się
połączyć
22
Nie mogłem znaleźć Terminal.app na liście, dopóki nie zdałem sobie sprawy, że muszę zajrzeć do folderu „Narzędzia”. Mam nadzieję, że to pozwoli komuś zaoszczędzić trochę czasu.
Glenn Lawrence
27
W OSX 10.8 i nowszych skrypt wykonywalny, którego nazwy nie mają sufiksu lub sufiksu, .commandjest domyślnie wykonywalny z Findera, bez potrzeby instruowania Findera, jak go otworzyć.
mklement0
1
„Wszystkie aplikacje” to ustawienie, którego mi brakowało… prawdopodobnie to, czego doświadczył Cheruvim. Co do komentarza Glenna: możesz po prostu użyć wbudowanej funkcji wyszukiwania w prawym górnym rogu okna; upewnij się, że wpisałeś pełną nazwę aplikacji, tj. Terminal.app.
starszy starszy
3
Nie jest to czysty sposób na zrobienie tego. Zmień nazwę skryptu na .commandrozszerzenie pliku.
Bachsau,
227

Czy próbowałeś użyć .commandrozszerzenia nazwy pliku?

Hagelin
źródło
3
To jest lepsze. W odpowiedzi @Lus folder roboczy to nie to samo, co otwierasz skrypt.
Rodrigo
6
Czy istnieje sposób uruchamiania zadań w tle bez okna konsoli?
Lapo
6
Pamiętaj, że bieżący katalog może nie być tym, w którym znajduje się Twój skrypt. Spójrz na to pytanie, aby poprawnie ustawić: stackoverflow.com/questions/59895/…
Pavel Alexeev
14
Nadal musisz mieć uprawnienia do wykonywania ( chmod +x), ale .commandrozszerzenie jest już połączone z terminalem. Świetne rozwiązanie, dziękuję
NorTicUs
Najwyraźniej użytkownik nie może wchodzić w interakcje z programem terminalowym za pomocą tej metody - chyba że się mylę?
Demis
153

Począwszy od OSX 10.10 (Yosemite) i od co najmniej OS X 10.8 (Mountain Lion) , zachowanie jest następujące po otwarciu (podwójnym kliknięciem) skryptów wykonywalnych z Findera :

  • Skrypty wykonywalne [1] z BEZ przyrostka lub przyrostka.command :
    • wykonywane domyślnie - konfiguracja nie jest wymagana :
      • otworzy się nowe okno terminala, w którym działa skrypt.
      • domyślnie okno pozostanie otwarte po zakończeniu skryptu, abyś mógł sprawdzić dane wyjściowe (chociaż w tym momencie powłoka, która uruchomiła skrypt, wyszła i nie możesz już z nim współdziałać ).
        Jednak za pomocą terminala Preferences... > Profilesmożesz zdecydować o automatycznym zamknięciu okna po zakończeniu skryptu.
    • Uwaga : folder roboczy jest niezmiennie folderem domowym bieżącego użytkownika , NIE folder, w którym znajduje się skrypt.
      • Aby zmienić skrypt powłoki na folder, w którym się on znajduje, umieść
        • cd -- "$(dirname "$BASH_SOURCE")" zaraz po linii shebang
        • lub, jeśli trzeba pozostać POSIX, cd -- "$(dirname "$0")".
        • Dla przypadków skrajnych , takich jak znalezienie prawdziwego katalogu źródłowego skryptu z dowiązaniem symbolicznym , zobacz moją odpowiedź .
    • Jeśli skrypt nieoczekiwanie nie jest wykonywalny :
      • Zrób to, uruchamiając się chmod +x <script>w terminalu; w przeciwnym razie zobaczysz następujące objawy:
      • .command: Finder wyświetla mylący komunikat o błędzie, który sugeruje, że problem można rozwiązać za pomocą File > Get Info, co nie jest prawdą - użyj chmod +xmetody sugerowanej powyżej.
      • bez przyrostka:
        • z linią shebang (np. #!/bin/bash): zachowanie jest tak, jakby to był przyrostek .sh- patrz poniżej.
        • z żadnym shebang linii: otwiera się w domyślnym edytorze tekstu (co jest TextEdit domyślnie).
  • Skrypty z przyrostkiem.sh , zarówno wykonywalne, jak i nie:
    • otwarte do edycji w TextEdit.applub, jeśli są zainstalowane, za pomocą Xcode.app.
  • Skrypty z przyrostkiem.scpt lub .applescript(nawet jeśli same są oznaczone jako pliki wykonywalne, co zwykle nie ma miejsca):
    • otwarty do edycji w[Apple]Script Editor
    • Zauważ, że pliki kodu źródłowego JXA wydają się nie mieć (jeszcze) wyraźnego przyrostka.
  • Skrypty z pomocą niestandardowego przyrostek (sufiks nie wiadomo jeszcze do systemu), czy plik wykonywalny lub nie (w rzeczywistości odnosi się do każdego rodzaju pliku):
    • skłonić cię do aplikacji, aby otworzyć je po raz pierwszy otworzyć je , a należy pamiętać, że wybór .

[1] Plik wykonywalny oznacza: skrypt z ustawionymi bitami uprawnień do wykonania i użytkownikiem wywołującym - w stosunku do własności pliku - dlatego potencjalnie może go wykonać.
Jeśli używasz chmod a+xustawić wszystkie bity uprawnień (co jest typowe), każdy może ją wywołać (zakładając, że są one również możliwość odczytu pliku na podstawie odczytu bitu zezwolenia (S) i własności danego pliku).

mklement0
źródło
1
Możliwe jest zamknięcie otwartego okna Terminalu, gdy skrypt kończy się za pomocą prostej, osascriptktórą można dołączyć do .commandpliku zamiast ręcznego wprowadzania zmian w profilu.
l'L'l
@ I'L'I: Czy masz na myśli dodanie osascript -e '...'polecenia na końcu skryptu? Jakie jest konkretne polecenie i czy zapewnia ono zamknięcie prawej karty, nawet jeśli skrypt nie jest uruchomiony na pierwszej karcie?
mklement0
5
@ mklement0: Tak, nie testowałem go dłużej niż kilka minut, ale podstawową ideą jest umieszczenie w ostatnim wierszu skryptu .command : osascript -e 'tell application "Terminal" to close front window' > /dev/null 2>&1 &... Może nie działać w każdym scenariuszu, chociaż przekierowanie na koniec jest naprawdę kluczem - w przeciwnym razie osascript można łatwo dostosować (np. okno może wymagać zmiany na tab, jeśli jest to domyślne zachowanie twojego terminala itp.).
l'L'l
Czy można nie dopuścić do zamknięcia okna / karty Terminala po .commanduruchomieniu pliku skryptu pomimo ustawienia profilu?
CyberMew
@CyberMew: Jeśli możesz zmodyfikować skrypt, dodaj na końcu polecenie oczekujące na naciśnięcie klawisza; np. jeśli jest to bashskrypt, dodaj read -p 'Press Return to close this window.'jako ostatnią instrukcję.
mklement0
38

Alternatywnie możesz utworzyć zwykłą aplikację Mac OS X ze skryptu za pomocą Platypus

svth
źródło
To naprawdę świetna aplikacja. Ale mam tutaj pewien problem. Mam skrypt w języku Python, który chcę przekonwertować na plik .app. Mój skrypt zawiera wiersz, w którym użytkownik musi wpisać dane wejściowe (raw_input ()), gdy .app osiągnie ten wiersz kodu, zgłasza błąd EOF (koniec pliku). Co mogę z tym zrobić?
1
To nie jest interaktywny terminal. Dziobak przedstawia jedynie wyniki skryptu. Brak komunikacji dwukierunkowej.
svth
4
Lub utwórz aplikację OS X za pomocą Automatora za pomocą akcji Uruchom skrypt powłoki.
Rangi Keen
15

Prostym sposobem jest zmiana numeru wewnętrznego na .commandlub brak rozszerzenia.

Ale to otworzy Terminal i będziesz musiał go zamknąć. Jeśli nie chcesz widzieć żadnych danych wyjściowych, możesz użyć Automatora, aby utworzyć aplikację Mac, którą możesz kliknąć dwukrotnie, dodać do stacji dokującej itp.

  1. Otwórz Automatoraplikację
  2. Wybierz typ „Aplikacja”
  3. Wpisz „uruchom” w polu wyszukiwania Działania
  4. Kliknij dwukrotnie „Run Shell Script”
  5. Kliknij Runprzycisk w prawym górnym rogu, aby go przetestować.
  6. File > Save stworzyć aplikację.

wprowadź opis zdjęcia tutaj

wisbucky
źródło
Świetny ! Jak możemy zautomatyzować ten przepływ pracy, aby był uruchamiany codziennie o godzinie 13:00?
iAkshay
9

Nie trzeba korzystać z aplikacji innych firm, takich jak Platypus.

Wystarczy utworzyć skrypt Apple za pomocą edytora skryptów i użyć polecenia do shell script "shell commands"do bezpośrednich wywołań poleceń lub wykonywalnych plików skryptów powłoki, zabezpieczyć gdzieś edytowalny plik skryptu, a następnie wyeksportować go, aby utworzyć skrypt aplikacji. skrypt aplikacji można uruchomić, klikając dwukrotnie lub wybierając w folderze paska.

Luc-Olivier
źródło
3
Co więcej, użyj Automatora i użyj akcji Uruchom skrypt powłoki bezpośrednio, zamiast przechodzenia przez skrypt Apple.
Rangi Keen
0

Możesz również ustawić wartości domyślne według rozszerzenia pliku za pomocą RCDefaultApp:

http://www.rubicode.com/Software/RCDefaultApp/

potencjalnie możesz ustawić .sh, aby otwierał się w iTerm / Terminal itp. wymagałoby to uprawnień użytkownika do wykonania, np

chmod u+x filename.sh

Panel przedni RCDefaultApp

Tomachi
źródło
0

chmod 774 filename

Uwaga : plik o nazwie „nazwa pliku”, który zawiera skrypt bash, nie ma rozszerzenia

Neo
źródło