web-dev-qa-db-ja.com

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

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

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

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

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

24
toupeira

Automator を開き、Applicationを選択して追加aRun Shell Scriptaction andput in your Shell commandbetween quotes(ファイルがある場合は、ドラッグアンドドロップするだけです)。

それを再生する以外に、今ではsaveit(アプリとしてどこでも)とsetアイコン

24
cregox

以下は、ほとんど労力を費やさない、素早くて汚い例です( "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????
    

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

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

7
JeffB

Platypus をチェックアウトすることをお勧めします。これにより、シェルスクリプトやその他の解釈されたスクリプトからMac OS Xアプリケーションが作成されます。

4
svth

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

enter image description here

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

enter image description here

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

3
slhck

キー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>
1
tig

他の可能なトレーニングがあります。自動化ワークフローでシェルスクリプトを保護します。 launchdを使用してワークフローを呼び出します。コードは次のとおりです。

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

これはプログラムを起動せず、メニューバーに表示されません。その方法は、カモノハシアプリよりも静かです。

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

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

コマンドはバックグラウンドでウルトラサイレントで実行されます。

1
Atalantia

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

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

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

osacompile'do Shell script "XXX"' applescriptスニペットをコンパイルします。シェルスクリプトはXXXです。

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

しかし、これはバカバカしなくてもBetterTouchToolから実行できます。

0
kenny