Bagaimana menjalankan skrip shell di OS X dengan mengklik dua kali?

233

Saya memiliki skrip shell yang memiliki izin eksekusi pengguna pada OS X, tetapi ketika saya mengklik dua kali, skrip itu terbuka di editor teks. Bagaimana saya bisa menjalankannya dengan mengklik dua kali?

c2h2
sumber

Jawaban:

266
  • Pertama di terminal membuat skrip dapat dieksekusi dengan mengetik:

    chmod a+x (yourscriptname)
  • Kemudian, di Finder, klik kanan file Anda dan pilih "Open with" dan kemudian "Other ...".

  • Di sini Anda memilih aplikasi yang Anda inginkan untuk mengeksekusi file, dalam hal ini adalah Terminal. Untuk dapat memilih terminal, Anda harus beralih dari "Aplikasi yang Dianjurkan" ke "Semua Aplikasi". (Aplikasi Terminal.app dapat ditemukan di folder Utilities)

  • CATATAN bahwa kecuali jika Anda tidak ingin mengaitkan semua file dengan ekstensi ini untuk dijalankan di terminal Anda tidak harus diperiksa "Selalu Buka Dengan".

  • Setelah mengklik OK Anda harus dapat menjalankan skrip Anda hanya dengan mengklik dua kali.
Lus
sumber
terima kasih saya mengerti, saya tidak tahu untuk bergaul dengan terminal, saya pikir perlu bergaul dengan / bin / sh
c2h2
22
Saya tidak dapat menemukan Terminal.app dalam daftar sampai saya menyadari bahwa saya harus mencari di folder "Utilities". Semoga ini akan menghemat waktu seseorang.
Glenn Lawrence
27
Pada OSX 10.8 dan lebih tinggi, script dieksekusi yang namanya memiliki baik tidak ada akhiran atau akhiran .commandadalah secara default executable dari Finder, tanpa perlu untuk menginstruksikan Finder cara membukanya.
mklement0
1
"Semua Aplikasi" adalah pengaturan yang saya lewatkan ... mungkin apa yang dialami Cheruvim juga. Adapun komentar Glenn: Anda cukup menggunakan fitur Pencarian built-in di sudut kanan atas jendela; pastikan Anda mengetikkan nama lengkap aplikasi, yaitu Terminal.app.
Penatua
3
Bukan cara bersih untuk melakukannya. Ubah nama skrip Anda menjadi .commandekstensi file.
Bachsau
227

Sudahkah Anda mencoba menggunakan .commandekstensi nama file?

Hagelin
sumber
3
Ini lebih baik. Di @Lus jawab folder yang berfungsi tidak sama dengan Anda membuka skrip.
Rodrigo
6
Apakah ada cara untuk meluncurkan tugas "latar belakang" tanpa jendela konsol?
lapo
6
Harap dicatat, bahwa direktori saat ini mungkin bukan yang berada di skrip Anda. Lihatlah pertanyaan ini untuk memperbaikinya: stackoverflow.com/questions/59895/…
Pavel Alexeev
14
Anda masih perlu memiliki izin eksekusi ( chmod +x) tetapi .commandekstensi sudah ditautkan dengan Terminal. Solusi hebat, terima kasih
NorTicUs
Tampaknya pengguna tidak dapat berinteraksi dengan program terminal dengan metode ini - kecuali saya salah?
Demis
153

Pada OSX 10.10 (Yosemite) dan sejak setidaknya OS X 10.8 (Mountain Lion) , perilaku adalah sebagai berikut ketika Anda membuka (klik dua kali) skrip yang dapat dieksekusi dari Finder :

  • Skrip yang dapat dieksekusi [1] dengan NO suffix atau suffix.command :
    • yang dijalankan secara default - tidak ada setup yang diperlukan :
      • a baru jendela Terminal terbuka di mana script berjalan.
      • secara default, jendela akan tetap terbuka setelah skrip berakhir sehingga Anda dapat memeriksa output (meskipun pada saat itu shell yang menjalankan skrip telah keluar dan Anda tidak dapat berinteraksi dengannya lagi ).
        Namun, melalui Terminal, Preferences... > ProfilesAnda dapat memilih untuk secara otomatis menutup jendela ketika skrip keluar.
    • Peringatan : folder yang berfungsi selalu merupakan folder rumah pengguna saat ini , BUKAN folder tempat skrip berada.
      • Untuk membuat perubahan skrip shell ke folder di mana ia berada, letakkan
        • cd -- "$(dirname "$BASH_SOURCE")" tepat setelah garis shebang
        • atau, jika Anda harus tetap mematuhi POSIX cd -- "$(dirname "$0")",.
        • Untuk kasus tepi, seperti menemukan direktori sumber sebenarnya skrip yang disinkronkan , lihat jawaban saya ini.
    • Jika skrip tidak terduga tidak dapat dieksekusi :
      • Jadikan itu dapat dieksekusi dengan menjalankan chmod +x <script>di Terminal; jika tidak, Anda akan melihat gejala berikut:
      • .command: Finder menampilkan pesan kesalahan menyesatkan yang menyarankan masalah dapat diperbaiki melalui File > Get Info, yang tidak benar - gunakan chmod +xmetode yang disarankan di atas.
      • tidak ada akhiran:
        • dengan garis shebang (misalnya, #!/bin/bash): perilaku seolah-olah sufiksnya .sh- lihat di bawah.
        • dengan tidak ada garis peristiwa: terbuka di editor teks default (yang TextEdit secara default).
  • Skrip dengan akhiran.sh , dapat dieksekusi atau tidak:
    • yang dibuka untuk mengedit di TextEdit.appatau, jika terpasang, dengan Xcode.app.
  • Skrip dengan akhiran.scpt atau .applescript(bahkan jika itu sendiri ditandai sebagai executable, yang biasanya tidak terjadi):
    • dibuka untuk mengedit di[Apple]Script Editor
    • Perhatikan bahwa file kode sumber JXA tampaknya tidak memiliki akhiran yang berbeda (belum).
  • Script dengan sebuah kustom akhiran (sufiks belum diketahui sistem), apakah dieksekusi atau tidak (pada kenyataannya, berlaku untuk setiap jenis file):
    • meminta Anda untuk aplikasi untuk membukanya ketika Anda pertama kali membukanya , dan ingat pilihan itu .

[1] Dapat dieksekusi berarti: skrip dengan set bit izin yang dapat dieksekusi dan pengguna panggilan - relatif terhadap kepemilikan file - karena itu berpotensi diizinkan untuk mengeksekusinya.
Jika Anda menggunakan chmod a+xuntuk mengatur semua bit izin (yang khas), siapa pun dapat memohonnya (dengan asumsi mereka juga diizinkan untuk membaca file berdasarkan bit izin baca dan kepemilikan file).

mklement0
sumber
1
Dimungkinkan untuk menutup jendela Terminal yang terbuka ketika skrip keluar dengan sederhana osascriptyang dapat Anda sertakan di dalam .commandfile alih-alih mengacaukan profil secara manual.
l'L'l
@ I'L'I: Apakah maksud Anda menambahkan osascript -e '...'perintah di akhir skrip seseorang? Apa perintah khusus, dan apakah itu memastikan bahwa tab kanan ditutup bahkan ketika skrip tidak berjalan di tab paling depan?
mklement0
5
@ mklement0: Ya, saya belum mengujinya lebih dari beberapa menit, tetapi ide dasarnya adalah memasukkan pada baris terakhir dari skrip perintah. Perintah : osascript -e 'tell application "Terminal" to close front window' > /dev/null 2>&1 &... Mungkin tidak berfungsi di setiap skenario, meskipun pengalihan di end benar-benar kuncinya - naskah osas dapat diadaptasi dengan mudah (mis. jendela mungkin perlu diubah ke tab jika itu adalah perilaku default terminal Anda, dll.).
l'L'l
Apakah mungkin untuk tidak membiarkan jendela / tab Terminal tutup setelah .commandfile skrip dijalankan meskipun pengaturan profil?
CyberMew
@CyberMew: Jika Anda dapat memodifikasi skrip, tambahkan perintah yang menunggu keystroke di akhir; mis., jika itu bashskrip, tambahkan read -p 'Press Return to close this window.'sebagai pernyataan terakhir.
mklement0
38

Atau, Anda dapat membuat aplikasi Mac OS X biasa dari skrip menggunakan Platypus

svth
sumber
Ini adalah aplikasi yang sangat bagus. Tapi saya punya masalah di sini. Saya memiliki skrip python yang ingin saya konversi menjadi file .app. Script saya termasuk baris di mana pengguna harus mengetik beberapa input (raw_input ()), ketika .app mencapai baris kode ini, ia melempar kesalahan EOF (akhir file). Apa yang bisa saya lakukan?
1
Ini bukan terminal interaktif. Platypus hanya menyajikan output skrip. Tidak ada komunikasi dua arah.
svth
4
Atau buat aplikasi OS X dengan Automator menggunakan tindakan Run Shell Script.
Rangi Keen
15

Cara mudah adalah mengubah ekstensi ke .commandatau tanpa ekstensi.

Tapi itu akan membuka Terminal, dan Anda harus menutupnya. Jika Anda tidak ingin melihat output apa pun, Anda dapat menggunakan Automator untuk membuat Aplikasi Mac yang dapat Anda klik dua kali, tambahkan ke dock, dll.

  1. Buka Automatoraplikasi
  2. Pilih jenis "Aplikasi"
  3. Ketik "run" di kotak pencarian Actions
  4. Klik dua kali "Run Shell Script"
  5. Klik Runtombol di sudut kanan atas untuk mengujinya.
  6. File > Save untuk membuat Aplikasi.

masukkan deskripsi gambar di sini

wisbucky
sumber
Bagus ! Bagaimana kita mengotomatiskan alur kerja ini agar berjalan setiap hari pada jam 1 siang?
iAkshay
9

Tidak perlu menggunakan aplikasi pihak ketiga seperti Platypus.

Cukup buat Apple Script dengan Script Editor dan gunakan perintah do shell script "shell commands"untuk panggilan perintah langsung atau file skrip yang dapat dieksekusi, jaga file skrip yang dapat diedit tetap aman di suatu tempat kemudian ekspor untuk membuat skrip Aplikasi. skrip aplikasi dapat diluncurkan dengan mengklik dua kali atau memilih di folder bar.

Luc-Olivier
sumber
3
Lebih baik lagi, gunakan Automator dan gunakan tindakan Run Shell Script secara langsung daripada melalui Apple Script.
Rangi Keen
0

Anda juga dapat mengatur default berdasarkan ekstensi file menggunakan RCDefaultApp:

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

berpotensi Anda dapat mengatur .sh untuk dibuka di iTerm / Terminal dll. itu akan membutuhkan izin eksekusi pengguna, misalnya

chmod u+x filename.sh

Panel preferensi RCDefaultApp

Tomachi
sumber
0

chmod 774 filename

Catatan : File dengan nama 'nama file' yang memiliki skrip bash tidak memiliki ekstensi

Neo
sumber