Terminal penceresi görünmeden OS X'te bir kabuk komut dosyası çalıştırılsın mı?


23

BetterTouchTool ve biraz AppleScript büyüsü ile yapabildiğim belirli iTerm oturumlarını açan birkaç klavye kısayolu kurmaya çalışıyorum. Sorun, OS X'in GUI aracılığıyla yürüttüğünüz kabuk komut dosyası için Terminal penceresini açmakta ısrar etmesi (yani Finder'dan veya BetterTouchTool'dan bir klavye kısayolu olarak). Komut dosyasını doğrudan başka bir terminalden çalıştırırsam terminal penceresi görünmez.

Bulduğum bir geçici çözüm, betiği gereksiz terminal penceresinin sorununu çözen bir .app dizinine sarmaktı, ancak başka bazı sorunları var (örneğin OS X, ortaya çıkan her iTerm penceresini ayrı bir uygulama olarak ele alıyor ve rıhtımı tıkıyor gibi görünüyor. ). (DÜZENLEME: Bu davranış aslında betiğimdeki bir hatadan kaynaklandı, aşağıya bakın)

Ayrıca Terminal uygulamasını görünmez bir şekilde taşımak için Spaces ayarlarında başka bir sanal masaüstüne atamayı denedim, ancak daha sonra komut dosyasını çalıştırmadan önce bu masaüstüne geçecek.

Bu davranışı tamamen devre dışı bırakmanın bir yolu var mı? Terminal tercihlerinde ayarı komut dosyası bittikten sonra pencereyi kapatmak için buldum, ancak Terminal penceresinin bir saniyeliğine açılması hala can sıkıcı.


Üzgünüm, tam olarak anlamıyorum. Bu kabuk komut dosyalarıyla ne yapmak istiyorsunuz? İTerm'i bir kabuk betiği üzerinden açmak istiyor musunuz? Sadece Terminal.app hakkında konuşuyor veya iTerm'i sorunuzda "Terminal" ile mi karıştırıyorsunuz? Çalıştırmaya çalıştığınıza bir örnek verebilir misiniz?
00'de slhck

Normal bir kabuk başlatmak, bir Rails konsolu açmak, Rails günlüğünü görüntülemek vb. Ama yine de, paket yaklaşımının düzgün çalışması için bir çözüm buldum (düzenlenmiş soruya bakın).
toupeira

Anlıyorum! Kendi sorunuza cevap vermeniz (aşağıdaki düğmeyi kullanarak) ve bize ne yaptığınızı veya sorunu nasıl çözdüğünüzü anlatmanız harika olurdu. Belki sorunuza bazı örnekler gönderin ve kısa bir cevap ekleyin. Bu şekilde, eğer birisi sizin görevinize rastlarsa, ondan bir şeyler öğrenebilirler!
14'te slhck

Peki hala asıl soru için bir cevabım yok (yani .app sarıcı kullanmak zorunda kalmadan Terminalden tamamen kaçınmak), bu yüzden birinin beni aydınlatabileceği durumda açık bırakmayı tercih ederim.
toupeira

1
Hala kafam karıştı. Sen yok Otomatı tarafından oluşturulan bir .APP yoluyla bunları çalıştırmak istiyor?
11:03, slhck

Yanıtlar:


21

Automator'ı açın , Uygulama'yı seçin , bir Kabuk Betiği Çalıştır eylemi ekleyin ve Kabuk komutunuzu tırnak işaretleri arasına koyun (bir dosyanız varsa, sürükleyip bırakabilirsiniz).

Oynatmak dışında, şimdi (her yerde bir uygulama olarak) kaydedebilir ve hatta simgeyi ayarlayabilirsiniz .


Tam ekran bir uygulamadan bu şekilde bir komut çalıştırmayı denedim, ancak her zaman arka planda açtı. Kabuğundaki komutu engellemeyen bir şekilde arka plana ekleyerek &mplayermplayer myvideo.avi &; osascript -e 'tell application "System Events" to set frontmost of the first process whose displayed name is "mplayer" to true'
arkamda kaldım

Cool hack @mcb Instagram Hesabında Takip Ettikleri Ama nedenini anlamıyorum. Genellikle terminal penceresini gizlemek isteriz çünkü ana pencere olan başka bir pencere açar. Mplayer'ın ilk terminal penceresine ihtiyacınız varsa, sanırım başka bir pencere açmıyor ve neden ilk etapta gizlemek istersiniz?
cregox

mplayerBir slayt gösterisinden (Skim'de) video oynatmak için kullanıyorum . Skim tam ekrana ayarlanmışsa, oyuncunun arka planda kaldığı bir hata var, ancak bu hatanın sadece Skim veya tüm tam ekran uygulamaları ile ilgili olup olmadığından emin değilim, bu yüzden çözümümü burada yayınlayacağımı düşündüm.
Lenar Hoyt

6

İşte neredeyse hiç çaba harcamadan hızlı ve kirli bir örnek ("myapp" adlı bir uygulama için):

  1. Kısmi bir uygulama hiyerarşisi oluşturun:

        mkdir -p ./myapp.app/Contents/MacOS
    
  2. Komut dosyanızın ilk satırının gerekli programın tam yoluna sahip olduğundan emin olun, örn.

    #!/bin/bash
    
  3. Kabuk betiğinize "myapp" (tırnak işaretleri yok, uzantı yok) adını verin, yürütme izinleri verin ve ardından MacOS alt dizinine yerleştirin. Yürütme izinlerini vermek için:

    chmod ugo+x myapp
    
  4. İçindekiler alt dizinine gidin ve şu dizeyi içeren bir PkgInfo dosyası oluşturun: APPL ???? [dizenin sonunda satır sonlandırıcı yok!] Dosyayı oluşturmak için cat (1) yardımcı programını kullanın:

    cat > PkgInfo
    APPL????
    

    Dizeyi yazdıktan sonra (return tuşuna basmayın!),
    Dosyayı iki satır sonlandırıcı olmadan kapatacak ve sizi kabuk istemine döndürecek iki kontrol-D girin .)

  5. Bulucudan yeni "uygulamanızı" çift tıklayın. Penceresiz çalışacaktır.


10.13.6 üzerinde çalışmadı, hata iletisi "Bu Mac türünde desteklenmediği için“ LoginSessionTimeLimit.app ”uygulamasını açamazsınız.
Douglas

1
Benim için Mojave'de (10.14.3) çalıştım. Bu yaklaşımı gerçekten beğendim. Teşekkürler.
loco.loop

10.13.6'da benim için çalıştı. @ Douglas Betiğinizi "manuel" olarak çalıştırmayı deneyin, örn. Terminal. Muhtemelen w / hatadan çıkıyor, bu yüzden sizin için çalışmıyor ...
marekful

Harika! Mojave'de çalışma test edildi 10.14.6
Nicola Mingotti

4

Kabuk komut dosyalarından ve diğer yorumlanmış komut dosyalarından Mac OS X uygulamaları oluşturan Platypus'a göz atmak isteyebilirsiniz .


3

Alfred gibi uygulama başlatıcılarını süslemeniz durumunda küçük bir çözüm var . Her gün kullanıyorum ve sessiz kabuk komut dosyaları çalıştırmanıza izin veren Powerpack'i aldım .

resim açıklamasını buraya girin

Bunlar çalışırken bir terminal açmaz ve herhangi bir anahtar kelime sırasına bağlanabilir. Parametreleri bile içerebilirler ve ek seçeneklere sahip olabilirler:

resim açıklamasını buraya girin

Bunu bazı küçük parçacıklar için kullanıyorum ve çok esnek.



1

Eğer anahtar eklerseniz LSUIElementve bunu ayarlamak 1içinde Info.plistuygulamanızın, bu Dock bir simge oluşturmaz.

İşte Info.plistbenim küçük kabuk script app:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleExecutable</key>
    <string>launch</string>
    <key>CFBundleIconFile</key>
    <string>launch</string>
    <key>LSUIElement</key>
    <string>1</string>
</dict>
</plist>

Teşekkürler, ama bunun bir etkisi yok gibi görünüyor. Ayrıca touchen yeni sürümün kullanıldığından emin olmak için paketi ing. Yine de, paket yaklaşımını gerçekten sevmiyorum çünkü her zaman ayrı uygulama örnekleri oluşturacak gibi görünüyor
toupeira

Benim için dokunma da yardımcı olmadı (LSUIElement'i kapatmaya çalıştım), başka bir tür önbellekleme var, ancak sıkıştırma ve çıkarma uygulaması yardımcı oldu. Neden paket yaklaşımını sevmiyorsunuz? Ayrıca applecript kullanabilirsiniz ve sadece çalıştırın do shell script "say 'arsti'", bu terminal penceresi açılmaz.
tig

Tamam, ben sadece bir aptal olduğumu ortaya çıkıyor ;-) Bir uygulamanın zaten AppleScript ile çalışıp çalışmadığını kontrol etmek için güvenilir bir yol bulamadım, bu yüzden çağıran normal bir bash betiği kullandım pgrepve ilgili kodu doğrudan osascript(AppleScript yorumlayıcısı). Sorun pgrepHomebrew'dan geldi ve varsayılan olarak değil $PATH. Bu yüzden betiğim zaten çalışıyor olsa bile her zaman yeni bir iTerm örneği başlattı. pgrepSenaryoda tam yolu ekledikten sonra paket yaklaşımı sonuçta iyi çalışıyor gibi görünüyor, bu yüzden şimdilik mutlu olduğumu düşünüyorum ;-)
toupeira 22:11

Bu cevabı yukarıdaki @JeffB'den biriyle ve @ tig'in Info.plist'inin basitleştirilmiş bir versiyonuyla ( CFBundleExecutableve CFBundleIconFiletuşlarını kaldırdım ) birleştirerek, mükemmel çalışması için bunu aldım.
Dave Land

0

İşte size bir çözüm:

Kabuk betiği çağıran bir el yazısı derleyin :)

osacompile -e 'do shell script "cd ~; echo aaa > temp.txt"' -o ~/name_of_script.scpt

osacompileDerleyecek 'do shell script "XXX"'applescript pasajı. Kabuk komut dosyanız XXX.

Alıntı yapmak için dikkat edin, kabuk komut dosyası hala bozulmamış derlemek için kullandığınız kabuk geçmiş almak için düzgün alıntı gerekir.

Ancak bu, herhangi bir saçma olmadan BetterTouchTool'dan çalıştırılabilir.


0

Başka bir olası egzersiz var. Kabuk betiğinizi bir otomasyon iş akışında güven altına alın. İş akışını launchd ile çağırın. Kod:

/usr/bin/automator /path/to/the/file.workflow

Bu, herhangi bir program başlatmayacak veya menü çubuğunda görünmeyecek ve bir Platypus uygulamasından daha sessiz olacaktır.

Kabuk komut dosyalarını yürütmenin daha iyi bir yolu doğrudan başlatmadadır.

/bin/bash /path/to/shellScript.command

komutu arka planda ultra sessizce yürütür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.