ターミナルウィンドウを表示せずにOS Xでシェルスクリプトを実行しますか?


23

特定のiTermセッションを開くいくつかのキーボードショートカットを設定しようとしています。これは、BetterTouchToolとAppleScriptのちょっとした魔法でできました。問題は、OS XがGUIを介して(つまり、Finderから、またはBetterTouchToolからのキーボードショートカットとして)実行するシェルスクリプトのターミナルウィンドウを開くことを要求することです。別のターミナルからスクリプトを直接実行すると、ターミナルウィンドウは表示されません。

私が見つけた回避策は、余分なターミナルウィンドウの問題を解決するスクリプトを.appディレクトリにラップすることでしたが、他のいくつかの問題があります(例えば、OS Xは各iTermウィンドウを個別のアプリとして扱い、ドックを混乱させるようです)。(編集:この動作は、実際にはスクリプトのバグが原因でした。以下を参照)

また、Spaces設定でターミナルアプリを別の仮想デスクトップに割り当てて見えないようにしようとしましたが、スクリプトを実行する前に最初にそのデスクトップに切り替えるだけです。

この動作を完全に無効にする方法はありますか?ターミナルの環境設定で、スクリプトの終了後にウィンドウを閉じる設定を既に見つけましたが、ターミナルウィンドウが1秒間ポップアップするのはいらいらします。


すみません、よくわかりません。これらのシェルスクリプトで何をしたいですか?シェルスクリプトを使用してiTermを開きますか?Terminal.appについてのみ話しているのですか、それとも質問でiTermを「Terminal」と混合しているのですか?実行しようとしているものの例を投稿できますか?
slhck

いくつかのiTermセッションをセットアップして、通常のシェルを起動したり、Railsコンソールを開いたり、Railsログを表示したりしています。iTermを排他的に使用しています。しかし、とにかく、バンドルアプローチを適切に機能させるソリューションを見つけました(編集された質問を参照)。
toupeira

そうですか!(下のボタンを使用して)独自の質問に答えて、何をしたか、またはどのように問題を解決したかを教えていただければ素晴らしいでしょう。たぶんあなたの質問にいくつかの例を投稿してから、簡単な答えを追加してください。このように、誰かがあなたの投稿につまずいた場合、彼らはそこから何かを学ぶかもしれません!
slhck

実際の質問に対する答えはまだありません(つまり、.appラッパーを使用せずにターミナルを完全に回避する方法)。
toupeira

1
私はまだ混乱しています。あなたはしていないのAutomatorで作成された.appを介して、それらを実行したいですか?
slhck

回答:


21

Automatorを開き、アプリケーションを選択し、シェルスクリプトの実行アクションを追加して、シェルコマンドを引用符で囲みます(ファイルがある場合は、ドラッグアンドドロップするだけです)。

再生する以外に、(どこでもアプリとして)保存、アイコンを設定することもできます


この方法でフルスクリーンアプリからコマンドを実行しようとしましたが、常にバックグラウンドで開きました。私は追加することにより、バックグラウンドに非ブロック方式でシェルのコマンドを持っていた&(私の場合はアプリを持参するAppleScriptを呼び出した後とmplayer前に): mplayer myvideo.avi &; osascript -e 'tell application "System Events" to set frontmost of the first process whose displayed name is "mplayer" to true'
Lenarホイト

@mcbのクールなハック。しかし、理由はわかりません。通常は、メインウィンドウである別のウィンドウを開くため、ターミナルウィンドウを非表示にします。mplayerの最初のターミナルウィンドウが必要な場合、別のウィンドウを開かないので、そもそもなぜ非表示にしたいのでしょうか。
クレゴックス

mplayerスライドショー(Skim)内からビデオを再生するために使用しています。Skimがフルスクリーンに設定されている場合、プレーヤーがバックグラウンドに留まるというバグがありますが、このバグがSkimのみに関連するのか、すべてのフルスクリーンアプリに関連するのかはわかりません。
レナーホイト

6

以下は、ほとんど手間をかけずに作成した簡単な例です(「myapp」という名前のアプリの場合)。

  1. 部分的なアプリケーション階層を作成します。

        mkdir -p ./myapp.app/Contents/MacOS
    
  2. スクリプトの最初の行に、必要なプログラムへの完全なパスがあることを確認してください。たとえば、

    #!/bin/bash
    
  3. シェルスクリプトに「myapp」という名前(引用符や拡張子なし)を付け、実行権限を付与してから、MacOSサブディレクトリに配置します。実行権限を付与するには:

    chmod ugo+x myapp
    
  4. Contentsサブディレクトリに移動し、文字列APPL ????を含むPkgInfoファイルを作成します。[文字列の最後に行末記号なし!] cat(1)ユーティリティを使用してファイルを作成します。

    cat > PkgInfo
    APPL????
    

    文字列を入力した後(リターンキーを押さないでください!)、2つのcontrol-Dを
    入力します。これにより、行末記号なしでファイルが閉じられ、シェルプロンプトに戻ります。

  5. ファインダーから新しい「アプリ」をダブルクリックします。ウィンドウなしで実行されます。


10.13.6で動作しませんでした。「このタイプのMacではサポートされていないため、アプリケーション「LoginSessionTimeLimit.app」を開けません」というエラーメッセージが表示されます。
ダグラスは

1
Mojave(10.14.3)で仕事をしてくれました。私はこのアプローチが本当に好きでした。ありがとう。
loco.loop

10.13.6で私のために働いた。@Douglas Heldは、ターミナルから「手動」でスクリプトを実行してみます。おそらくエラーで終了するため、機能していません...
marekful

すごい!Mojave 10.14.6で動作確認済み
Nicola Mingotti

4

シェルスクリプトやその他の解釈されたスクリプトからMac OS Xアプリケーションを作成するPlatypusをチェックしてください。


3

Alfredのようなアプリケーションランチャーを使いこなす場合の小さな回避策を次に示します。私は毎日使用していますが、サイレントシェルスクリプトを実行できるPowerpackを購入しました

ここに画像の説明を入力してください

これらは実行時にターミナルを開かず、任意のキーワードシーケンスにバインドできます。パラメータを含めることもでき、追加のオプションがあります。

ここに画像の説明を入力してください

これをいくつかの小さなスニペットに使用しますが、非常に柔軟です。



1

あなたは、キーを追加した場合LSUIElementに、それを設定1Info.plistのアプリの、それはDockのアイコンを作成しません。

これはInfo.plist私の小さなシェルスクリプトアプリです。

<?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>

感謝しますが、これは効果がないようです。またtouch、最新バージョンが使用されていることを確認するためにバンドルを試してみました。それは常に別のアプリのインスタンスが作成されますようですので、しかし、いずれにせよ、私は本当にバンドルアプローチ好きではない
toupeira

私にとってもタッチは助けになりませんでした(LSUIElementをオフにしようとしました)、他の種類のキャッシングがありますが、アプリケーションの圧縮と抽出は役立ちました。バンドルアプローチが好きではないのはなぜですか?またdo shell script "say 'arsti'"、applescriptを使用して実行するだけで、ターミナルウィンドウは開きません。
tig

さて、私は単なるばかです;-)アプリがすでにAppleScriptで実行されているかどうかを確認する信頼できる方法を見つけることができなかったので、を呼び出してpgrepから関連するコードを直接渡す通常のbashスクリプトを使用しましたosascript(AppleScriptインタープリター)。問題は、pgrepHomebrewから来たものであり、デフォルトではありません$PATH。そのため、私のスクリプトは、すでに実行されていたとしても、常に新しいiTermインスタンスを起動しました。pgrepスクリプトにフルパスを追加した後、バンドルアプローチは結局うまく機能するように見えるので、私は今のところ満足していると思います
;

この回答と上記の@JeffBの回答、および@tigのInfo.plistの簡易バージョン(CFBundleExecutableCFBundleIconFileキーを削除しました)を組み合わせることで、これが完全に機能するようになりました。
デイ

0

ここに少しの回避策があります:

シェルスクリプトを呼び出すapplescriptをコンパイルします:)

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

osacompileコンパイルされ'do shell script "XXX"'たAppleScriptスニペットを。シェルスクリプトはXXXです。

引用に注意してください。シェルスクリプトを適切に引用して、使用しているシェルを無視してコンパイルする必要があります。

ただし、これはBetterTouchToolからなんの奇抜さもなく実行できます。


0

他の可能なトレーニングがあります。オートマトラワークフローでシェルスクリプトを安全にします。launchdでワークフローを呼び出します。コードは次のとおりです。

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

これにより、プログラムが起動したり、メニューバーに表示されたりすることなく、Platypusアプリよりも静かになります。

シェルスクリプトを実行するさらに良い方法は、launchdで直接行うことです。

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

バックグラウンドで超静かにコマンドを実行します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.