コマンドラインからMac OSアプリを簡潔に開始します
-
16-10-2019 - |
質問
私はコマンドラインでかなりの量の仕事をしていますが、フォームの多くのエイリアスを定義していることに気づきました。
alias skim='/Applications/Skim.app/Contents/MacOS/Skim'
実行可能ファイルの「Foo」を要求することで、executable/Applications/foo.app/contents/macos/fooを自動的に使用するような魔法を追加する方法はありますか? これはOS X 10.6にあります。
(私はできることを知っています open foo.pdf
, 、しかし、SkimはデフォルトのPDFリーダーではありません。一般的なソリューションが必要です。場合によっては、問題のアプリケーションをファイルのデフォルトハンドラーとして設定することは適切ではありません。)
解決
最後に私はそれを手に入れました:これをあなたに追加します .bash_profile
function foomagick() {
rm -f ~/.foomagick.tmp
ls /Applications/ | grep "\.app" | grep -v iWork | while read APP; do
# clean it up
a=`echo $APP | sed s/\ //g`;
a=`echo $a | sed s/\'//g`;
echo alias ${a%.*}="'open -a \"${APP%.*}\"'" >> ~/.foomagick.tmp
done
source ~/.foomagick.tmp
rm ~/.foomagick.tmp
}
foomagick()
今、次の作業:
Skim # open Skim.app
Skim foo.pdf
FireFox http://google.com
FireFox google.com # ERROR. Looks for local file.
Reidによる編集:
エイリアスの代わりにラッパースクリプトを作成するPythonスクリプトとして上記を実装しました。あなたは置く必要があります ~/bin/mankoffmagic
あなたの道で。ラッパーを自動的に更新したい場合は、CronまたはSomesuchから定期的に実行してください。
#!/usr/bin/python
#
# This script automagically updates a set of wrapper shell scripts in
# ~/bin/mankoffmagic which call Mac apps installed in /Applications.
#
# Inspired by mankoff's shell alias posted on apple.stackexchange.com; see:
# http://apple.stackexchange.com/questions/4240/concisely-starting-mac-os-apps-from-the-command-line/4257#4257
#
# Notes/Bugs:
#
# 1. Does not follow symlinks (aliases?)
#
# 2. Assumes that application names do not contain double-quotes.
#
# 3. Not very smart about finding the actual binary (it guesses). This is
# wrong sometimes, e.g. Firefox. Probably a deeper understanding of the app
# package structure would fix this.
import copy
import glob
import os
import os.path
import re
BINDIR = os.path.expandvars("$HOME/bin/mankoffmagic")
APP_RE = re.compile(r'(.*)\.app$')
STRIP_RE = re.compile(r'[\W_]+')
def main():
# We aggressively delete everything already in BINDIR, to save the trouble
# of analyzing what should stay
for f in glob.glob("%s/*" % BINDIR):
os.unlink(f)
# Walk /Applications and create a wrapper shell script for each .app dir
for (root, dirs, files) in os.walk("/Applications"):
dirs_real = copy.copy(dirs) # so we can manipulate dirs while looping
for d in dirs_real:
#print "checking %s" % os.path.join(root, d)
m = APP_RE.search(d)
if (m is not None):
#print "Found " + m.group()
dirs.remove(d) # no need to recurse into app
create_script(root, d, m.group(1))
def create_script(path, appdir, appname):
# remove non-alphanumerics and downcase it
wrapper = STRIP_RE.sub('', appname).lower()
wrapper = os.path.join(BINDIR, wrapper)
fp = open(wrapper, "w")
# Twiddle the comments in the script depending on whether you want to
# invoke the binary or use "open" -- the former lets you use any
# command-line args, while the latter is more Mac-like (app puts itself in
# the front, etc.)
fp.write("""
#!/bin/sh
exec "%s/%s/Contents/MacOS/%s" "$@"
#open -a "%s" "$@"
""" % (path, appdir, appname, appname))
fp.close()
os.chmod(wrapper, 0700)
if (__name__ == "__main__"):
main()
他のヒント
あなたは派手なものを必要としません、あなたはすでに答えを持っています。試す:
open /Applications/Foo.app bar.pdf
編集時
以下のコメントに照らして、私の答えはまだ比較的似ていると思います...私はオープンする機能を作成し、プッシュを行います /Applications
, 、電話 /usr/bin/open $appName.app $args
, 、POPDを行い、戻ります。
私はシェルスクリプトを吸いますが、以下のようなものは特別なケースをカバーし、Appleが提供するAppleとほぼ同じ構文を使用し続けます。私は自分の環境をできるだけきれいに保つのが好きです。
構文は宇宙からのものであると確信しています:
function open($appName, $args)
{
#if we are calling open without a path like /Applications/TextEdit.app AND
# $appName ends in '.app'
if (!hasParent($appName) && isApp($appName))
{
pushd /Applications
/usr/bin/open ${appName}.app $args &
popd
return
}
#otherwise, use open as normal
/usr/bin/open $appName $args
return
}
2回目の編集で
@Mankoffの元の質問についてのコメントを見ると、上記の機能のほとんどのものは、おそらく使用できるので時間の無駄になるでしょう open -a $appName
. 。したがって、マンコフはおそらく最も簡単な解決策を持っているので、彼のコメントを答えに変更するはずです;)
私が考えることができる2つの解決策があります:
より簡単な方法 - を使用します Info.plist
各.appのファイル Contents
ディレクトリは、cfbundleexecutable cfbundleexecutableのキーの値のインデックスを作成します。次に、実行可能ファイルの名前と渡したい引数を使用して、スクリプト(Perl、Pythonなど)を呼び出す短いエイリアスを追加します。
インデックスは、実行可能ファイルへの実行可能な名前とパスのペアになります。これを更新するには、定期的なスケジュールされたスクリプトを書く必要があります。
あなたは電話することができるようになるでしょう:
f foo file.txt
ここで、fは、[実行可能ファイルの名前]のインデックスをチェックするスクリプトのエイリアスです foo
.
全体として、あなたが望む機能を取得するための多くの作業はありません。
難しい方法 - シェルを拡張して、その取り扱いを補完する command_not_found
エラー。基本的に、ルビースタイルを実装します method_missing
使用しているシェル内の機能。いつ command_not_found
スローされ、メソッドはインストールされているアプリケーションの実行可能な名前を確認します。
救助へのapplescript:
osascript -e 'tell application "iTunes"' -e "activate" -e 'end tell'
アプリケーションの名前を開始するアプリケーションに置き換えると、完了します。もちろん、必要に応じてシェル関数にすることができます。
function f() {
osascript <<EOF
tell application "$1"
activate
end tell
EOF
}
そしてそのように使用してください:
f iTunes
私はapplescriptが嫌いですが、時々便利であり、コマンドラインの名前だけでアプリケーションに対処する唯一の方法だと思います。他のすべてにはフルパスが必要です。