Menjalankan Script Shell dari OS X Dock?

160

Bagaimana cara saya membuat skrip shell untuk dieksekusi dari dock Mac OSX? Tampaknya hanya dengan membuat pintasan akan membuka file di editor saya. Apakah ada bendera yang harus saya atur di suatu tempat untuk memerintahkan agar dijalankan alih-alih membukanya untuk diedit?

Wilco
sumber
2
seharusnya memberi +1 hanya untuk avatar, meskipun saya juga suka topiknya.
Matt Bannert
Anda mungkin ingin mempertimbangkan untuk mengalihkan jawaban yang diterima ke jawaban ke-2 @Wilco. Saya pikir itu jawaban yang lebih baik.
Gray

Jawaban:

190

Anda dapat membuat alur kerja Automator dengan satu langkah - "Jalankan Script Shell"

Kemudian File > Save As, dan ubah Format File menjadi "Aplikasi". Saat Anda membuka aplikasi, itu akan menjalankan langkah Shell Script, menjalankan perintah, keluar setelah selesai.

Keuntungan dari hal ini adalah sangat sederhana untuk dilakukan, dan Anda dapat dengan mudah mendapatkan input pengguna (katakanlah, memilih banyak file), kemudian meneruskannya ke input skrip shell (baik untuk stdin, atau sebagai argumen).

(Automator ada di /Applicationsfolder Anda !)

Contoh alur kerja

dbr
sumber
6
@dbr, tombol GUI pusher! :) Hanya bercanda, itu saran yang bagus!
willasaywhat
Ya, itu adalah saran yang sangat baik :) Aku bahkan sudah menulis tindakan Automator untuk beberapa aplikasi saya dan saya masih lupa tentang hal itu di saat seperti ini :)
Jason Coco
Saya tidak bisa menjalankan ini dengan nohup, ala "nohup / usr / bin / myscript &; disown -a && keluar 0". Saya membutuhkan aplikasi / alur kerja untuk menjalankan skrip dan segera keluar. Ada ide? :-)
jam kembali
3
@martineau Jika Anda membuka aplikasi dengan melakukan open -a SomeAppThing.app --args --etc=2itu harus fokus. Atau Anda dapat memfokuskannya menggunakan Applescript (mis. osascript -e 'tell application "Google Chrome" to activate')
dbr
1
Catatan: jika skrip Anda meluncurkan aplikasi GUI yang akan tetap terbuka untuk sementara waktu, ini akan menampilkan ikon roda gigi yang terus berputar di taskbar hingga aplikasi ditutup. Satu solusi adalah menambahkan `&> / dev / null &` ke baris peluncuran skrip sehingga Automator tidak menunggu.
ewall
50

Jika Anda tidak memerlukan jendela Terminal, Anda dapat membuat file yang dapat dieksekusi sebagai Aplikasi hanya dengan membuat skrip shell Exampledan memindahkannya ke nama file Example.app/Contents/MacOS/Example. Anda dapat menempatkan aplikasi baru ini di dok Anda seperti yang lain, dan jalankan dengan klik.

CATATAN: nama aplikasi harus sama persis dengan nama skrip. Jadi direktori tingkat atas harus Example.appdan skrip dalam Contents/MacOSsubdirektori harus dinamai Example, dan skrip harus dieksekusi.

Jika Anda perlu memiliki jendela terminal ditampilkan, saya tidak punya solusi sederhana. Anda mungkin bisa melakukan sesuatu dengan Applescript, tapi itu tidak terlalu bersih.

Jeremy Banks
sumber
1
Anda tidak tahu apakah ada cara mudah untuk mengirimkan file sebagai argumen ke skrip shell? Untuk file yang dibuka menggunakan "buka dengan ...".
Fuzzy76
9
Bagi siapa pun yang mencoba melakukan ini - nama aplikasi harus sama persis dengan nama skrip. Jadi itu benar-benar harus example.sh.app, bukan hanya example.app. Anda akan mendapatkan peringatan tentang aplikasi yang rusak jika ini tidak cocok
Kip
1
Untuk memperjelas - Saya OSX noob - maksud Anda hanya membuat struktur folder seperti yang ditunjukkan pada contoh Anda dengan file skrip yang ditempatkan di dalamnya seperti yang ditunjukkan?
martineau
2
@martineau Ya, itu benar. Jika Anda membuat folder yang namanya berakhir .appdan dengan struktur itu, itu akan diperlakukan sebagai Aplikasi yang dapat dieksekusi. Jika Anda ingin melihat isi folder itu di Finder, Anda harus mengklik kanan padanya dan memilih "melihat isi paket" (karena mengklik dua kali pada itu akan menjalankan aplikasi). Di Terminal, itu hanya akan muncul menjadi folder. (Saya tidak yakin apakah Finder akan membiarkan Anda mengganti nama folder menjadi .app dengan sendirinya; Anda mungkin perlu melakukan penggantian nama di Terminal.)
Jeremy Banks
1
Saya baru saja mencoba ini, dan menerima kesalahan dalam El Capitan (10.11) dari: "Anda tidak dapat membuka .... karena aplikasi powerpc tidak lagi didukung." : D Itu cukup menarik!
AllenH
26

Di OSX Mavericks:

  1. Buat skrip shell Anda.
  2. Jadikan skrip shell Anda dapat dieksekusi:

    chmod +x your-shell-script.sh
  3. Ubah nama skrip Anda untuk memiliki .appakhiran:

    mv your-shell-script.sh your-shell-script.app
  4. Seret skrip ke dok OSX.
  5. Ganti nama skrip Anda kembali menjadi .shsuffix:

    mv your-shell-script.app your-shell-script.sh
  6. Klik kanan file di Finder, dan klik opsi "Dapatkan Info".
  7. Di bagian bawah jendela, atur skrip shell agar terbuka dengan terminal.

Sekarang ketika Anda mengklik skrip di dok, jendela terminal akan muncul dan menjalankan skrip Anda.

Bonus: Untuk menutup terminal ketika skrip Anda telah selesai, tambahkan exit 0di akhir dan ubah pengaturan terminal menjadi "tutup shell jika keluar dengan bersih" seperti yang dikatakan dalam jawaban SO ini .

stiemannkj1
sumber
Bagus, ini bekerja untuk saya, cara apa pun untuk kebetulan ikon saya bertanya-tanya. FYI: JUGA langkah 7 mengacu pada file dan bukan item menu ...
Mike Q
cara yang bagus! cukup semua .sh dengan terminal terbuka.
iHTCboy
@ stiemannkj1, Apakah ini menunjukkan ikon saat aplikasi sedang berjalan? Apakah ada cara untuk menyembunyikannya?
Pacerier
@Pacerier, maaf, saya tidak lagi menggunakan OSX (beralih ke Linux :)). Anda mungkin ingin mencoba jawaban Jeremy Bank . Saya tidak punya ide lain dan karena saya tidak memiliki OSX, saya tidak dapat menguji atau mengacaukan apa pun untuk mencoba dan menampilkan / menyembunyikan ikon ..
stiemannkj1
17

Saya tahu ini sudah lama tetapi jika bermanfaat bagi orang lain:

Jika Anda perlu menjalankan skrip dan ingin terminal muncul sehingga Anda dapat melihat hasil yang dapat Anda lakukan seperti yang dikatakan Abyss Knight dan mengubah ekstensi menjadi .command. Jika Anda mengklik dua kali di atasnya itu akan membuka jendela terminal dan berjalan.

Namun saya membutuhkan ini untuk dijalankan dari automator atau appleScript. Jadi untuk mendapatkan ini untuk membuka terminal baru perintah yang saya jalankan dari "run shell script" adalah "open myShellScript.command" dan dibuka di terminal baru.

Jason Tholstrup
sumber
indah terima kasih! Sekarang semua ingin menjadikannya solusi yang sempurna akan menjadi cara untuk menutup jendela terminal ketika skrip selesai.
Peter M
1
baik jika Anda memiliki jendela dekat saat keluar yang dipilih dalam preferensi terminal Anda dapat menambahkan perintah keluar ke skrip Anda dan Anda akan memiliki apa yang Anda inginkan.
Jason Tholstrup
7

Selama skrip Anda dapat dieksekusi dan tidak memiliki ekstensi apa pun, Anda dapat menyeretnya apa adanya ke sisi kanan (sisi Dokumen) dari Dok dan akan berjalan di jendela terminal saat diklik alih-alih membuka editor.

Jika Anda ingin memiliki ekstensi (seperti foo.sh), Anda dapat pergi ke jendela info file di Finder dan mengubah aplikasi default untuk skrip tertentu dari apa pun itu (TextEdit, TextMate, apa pun default yang ditetapkan pada komputer Anda untuk File .sh) ke Terminal. Kemudian hanya akan menjalankan bukannya membuka dalam editor teks. Sekali lagi, Anda harus menyeretnya ke sisi kanan Dock.

Jason Coco
sumber
1
CATATAN : Ini berfungsi seperti juara di OS X 10.10 Yosemite. Saya tidak bisa mengomentari 10.9
Bryan Ash
1
Bekerja pada 10.11. Terima kasih!
Yassine Imounachen
Bekerja pada 10,12 juga! Mungkin komentar saya tentang 10.9 salah, tetapi saya perhatikan Anda perlu memastikan Anda menyeretnya ke bagian dermaga di bawah pemisah. Sayangnya saya tidak memiliki cara untuk menguji ulang 10.9.
stiemannkj1
Tidak perlu menambahkannya ke Dock. Itu dapat dijalankan dari desktop. Tetapi tidak ada ekstensi. Jadikan itu dapat dieksekusi dan Anda bisa mengklik dua kali. Ini adalah opsi paling sederhana yang pernah saya lihat.
Rich Apodaca
5

Saya pikir utas ini mungkin membantu: http://forums.macosxhints.com/archive/index.php/t-70973.html

Untuk memparafrasekan, Anda dapat mengganti nama dengan ekstensi .command atau membuat AppleScript untuk menjalankan shell.

willasaywhat
sumber
Pada Snow Leopard setidaknya, menambahkan ekstensi .command ke skrip membuatnya berjalan di terminal jika Anda mengklik dua kali, tetapi untuk beberapa alasan Anda masih tidak bisa menyeretnya ke dermaga. Saran dbr dan Jeremy sama-sama bekerja untukku.
Jo Liss
5

Seperti yang disebutkan joe, membuat skrip shell dan kemudian membuat skrip applescript untuk memanggil skrip shell, akan mencapai ini, dan sangat berguna.

Script Shell

  1. Buat skrip shell Anda di editor teks favorit Anda, misalnya:

    mono "/Volumes/Media/~Users/me/Software/keepass/keepass.exe"

    (ini menjalankan executable w32, menggunakan kerangka kerja mono)

  2. Simpan skrip shell, untuk contoh saya "StartKeepass.sh"

Skrip Apple

  1. Buka AppleScript Editor, dan panggil skrip shell

    do shell script "sh /Volumes/Media/~Users/me/Software/StartKeepass.sh" user name "<enter username here>" password "<Enter password here>" with administrator privileges

    • do shell script - perintah applescript untuk memanggil perintah shell eksternal
    • "sh ...." - ini adalah skrip shell Anda (path lengkap) yang dibuat pada langkah pertama (Anda juga dapat menjalankan perintah langsung, saya bisa menghilangkan skrip shell dan jalankan perintah mono saya di sini)
    • user name - menyatakan ke applescript Anda ingin menjalankan perintah sebagai pengguna tertentu
    • "<enter username here> - ganti dengan nama pengguna Anda (menjaga kutipan) ex "josh"
    • password - menyatakan untuk menuliskan sandi Anda
    • "<enter password here>" - ganti dengan kata sandi Anda (menjaga tanda kutip) ex "mypass"
    • with administrative privileges - menyatakan Anda ingin menjalankan sebagai admin

Buat .APP Anda

  1. simpan applescript Anda sebagai filename.scpt, dalam kasus saya RunKeepass.scpt

  2. simpan sebagai ... applescript Anda dan ubah format file ke aplikasi, menghasilkan RunKeepass.app dalam kasus saya

  3. Salin file aplikasi Anda ke folder aplikasi Anda

CJoshDoll
sumber
5

Di Editor Skrip:

do shell script "/full/path/to/your/script -with 'all desired args'"

Simpan sebagai bundel aplikasi.

Selama semua yang Anda ingin lakukan adalah mendapatkan efek dari skrip, ini akan berfungsi dengan baik. Anda tidak akan melihat STDOUT atau STDERR.

Joe McMahon
sumber
2
Saya akan menyarankan: "Simpan sebagai aplikasi BUNDLE". Bundel diluncurkan jauh lebih cepat daripada aplikasi.
e.James
-3

Seseorang menulis ...

Saya hanya mengatur semua file yang berakhiran ".sh" untuk dibuka dengan Terminal. Ini berfungsi dengan baik dan Anda tidak perlu mengubah nama setiap skrip shell yang ingin Anda jalankan.

Jonny
sumber