কমান্ড লাইন থেকে নিখুঁতভাবে ম্যাক ওএস অ্যাপ্লিকেশন শুরু করা


22

আমি কমান্ড লাইনে ন্যায্য পরিমাণে কাজ করি এবং আমি নিজেকে ফর্মের অনেক উপাত্ত সংজ্ঞা দিতে দেখি:

alias skim='/Applications/Skim.app/Contents/MacOS/Skim'

ম্যাজিক যুক্ত করার কি উপায় আছে যে ফাঁসি কার্যকর করার জন্য জিজ্ঞাসা করা "foo" স্বয়ংক্রিয়ভাবে এক্সিকিউটেবল / অ্যাপ্লিকেশনস / ফু.অ্যাপ / কনটেন্টস / ম্যাকোস / ফু ব্যবহার করে? এটি ওএস এক্স 10.6 এ রয়েছে।

(আমি সচেতন যে আমি করতে পেরেছি open foo.pdf, তবে স্কিম ডিফল্ট পিডিএফ পাঠক নয়, এবং আমি একটি সাধারণ সমাধান চাই - কিছু ক্ষেত্রে, ফাইলটির ডিফল্ট হ্যান্ডলার হিসাবে প্রশ্নটিতে অ্যাপ্লিকেশনটি সেট করা উপযুক্ত নয়))


22
আপনি পারেন open -a Skim foo.pdf

1
@ মানকফ: দুর্দান্ত, আমি ভুলে গেছি আপনি অ্যাপ্লিকেশন ডায়রের কাছ থেকে একটি অ্যাপ্লিকেশন চান তা খোলার জন্য ব্যবহার করতে পারেন could আপনার এটিকে একটি উত্তরে পরিবর্তন করা উচিত :)
রবার্ট এস সিয়াসসিও

@ রিড: আপনি টাইপ করতে সক্ষম হচ্ছেন এমন উদাহরণ কমান্ড লাইন অন্তর্ভুক্ত করতে আপনি কি নিজের প্রশ্ন সম্পাদনা করতে পারবেন?
রবার্ট এস সিয়াসসিও

@ ম্যানকফ যার অর্থ তার নিশ্চিত বা ট্যাব সমাপ্তির প্রসারণের জন্য এলিয়াসের প্রয়োজন
রবার্ট এস সিয়াসসিও

@ সমাধান নিয়ে কোনও সমস্যা পড়ুন?

উত্তর:


10

অবশেষে আমি এটি পেয়েছি: এটি আপনার যুক্ত করুন .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.

রিড দ্বারা সম্পাদনা করুন:

আমি উপরেরটি পাইথন স্ক্রিপ্ট হিসাবে প্রয়োগ করেছি যা এলিয়াসের পরিবর্তে মোড়ক স্ক্রিপ্ট তৈরি করে। আপনাকে ~/bin/mankoffmagicআপনার পথে লাগাতে হবে । আপনি যদি চান যে মোড়কগুলি স্বয়ংক্রিয়ভাবে আপডেট হতে পারে তবে ক্রোন বা সামসুচ থেকে এটি নিয়মিত চালান।

#!/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()

"গ্রেপ-ভি আইওয়ার্ক" কেবল সেখানেই রয়েছে কারণ "আইওয়ার্ক '09" -তে অ্যাডাস্ট্রোফ জিনিসগুলিকে গোলমাল করছে। মনে রাখবেন যে আপনি যদি অন্য কোথাও অ্যাপ্লিকেশনগুলি সঞ্চয় করেন (local / স্থানীয় / অ্যাপ্লিকেশনগুলি) কেবল এটি lsকমান্ডটিতে যুক্ত করুন এবং এটি সেখানেও কাজ করবে।

সুন্দর. আমি এটি পছন্দ করি যে এটি গতিশীল তাই আপনি পুরানো এলিয়াস পরিষ্কার করার মতো কোনও রক্ষণাবেক্ষণের সমস্যাটি শেষ করবেন না।
রবার্ট এস সিয়াসসিও

ধন্যবাদ @ মানকফ! খুব গন্ধ লাগে - একবার আমি এটি পরীক্ষা করেছি এবং এটি কাজ করে আমি উত্তরটি স্বীকৃত হিসাবে চিহ্নিত করব। অনেক প্রশংসিত.
রিড

ঠিক আছে, এটি কাজ করে। এটি অ্যাপস্ট্রোফের (এবং সম্ভবত নামটিতে অন্যান্য মজাদার অক্ষর) সহ অ্যাপ্লিকেশনগুলিতে বিরতি দেয়। আমি আপনার সমাধানটি পেয়েছি এবং পাইথনেও অনুরূপ কিছু করেছি, যা আমি অন্য উত্তরে পোস্ট করব - যদিও এটি যদি সঠিক শিষ্টাচার না হয় তবে আমি এটির পরিবর্তে (বা যাই হোক না কেন) আপনার উত্তরে যুক্ত করতে পেরে খুশি।
রিড

8

আপনার অভিনব কিছু দরকার নেই, আপনার কাছে ইতিমধ্যে উত্তর রয়েছে। চেষ্টা করুন:

open /Applications/Foo.app bar.pdf

সম্পাদনা উপর

নীচের মন্তব্যের আলোকে, আমি মনে করি আমার উত্তরটি এখনও তুলনামূলকভাবে অনুরূপ হবে ... আমি এমন একটি ফাংশন করব যা ওভাররাইডগুলি খুলবে, একটি ধাক্কা খায় /Applications, কল করবে /usr/bin/open $appName.app $args, একটি পপড করবে এবং ফিরে আসবে।

আমি শেল স্ক্রিপ্টিং এ স্তন্যপান করি তবে নীচের মতো কিছু যা বিশেষ কেসগুলিকে আচ্ছাদন করে এবং আপনাকে আপেল খোলার জন্য সরবরাহ করা হিসাবে একই রকম সিনট্যাক্স ব্যবহার করে। আমি আমার পরিবেশটি যতটা সম্ভব পরিষ্কার রাখতে চাই।

আমি নিশ্চিত সিনট্যাক্সটি বাইরের স্থান থেকে এসেছে:

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
}

দ্বিতীয় সম্পাদনা

আসল প্রশ্নে @ ম্যানকফের মন্তব্য দেখে, উপরের ফাংশনটির বেশিরভাগ উপাদান সম্ভবত সময় নষ্ট হবে কারণ আপনি কেবল ব্যবহার করতে পারেন open -a $appName। সুতরাং ম্যানকফের সম্ভবত সবচেয়ে সহজ সমাধান রয়েছে এবং তার মন্তব্যে একটি উত্তরে পরিবর্তন করা উচিত;)


আমি মনে করি @ রিড একটি স্বল্পতর পথ চাই w / o ম্যানুয়ালি সমস্ত উপকরণ তৈরি করে।

তবে তিনি অ্যাপ অ্যাপ্লিকেশন প্যাকেজে 'ওপেন' ব্যবহার করেন তবে ইউনিক্স এক্সিকিউটেবলের জন্য তার কোনও উপ নাম তৈরি করতে হবে না। আমি এই ধারণাটি পেয়েছিলাম যে তিনি উপাধি তৈরি করছেন কারণ তিনি ভেবেছিলেন যে কমান্ড লাইন থেকে সরাসরি অ্যাপ্লিকেশন শুরু করার একমাত্র উপায় হ'ল ম্যাকোস ডিরেক্টরিতে গিয়ে সমস্ত অ্যাপ্লিকেশনটির ভিতরে 'আসল' কার্যকরযোগ্য ফাইলটি চালানো। সুতরাং সেক্ষেত্রে, কোনও অ্যাপ্লিকেশন শুরু করার জন্য আপনার প্রয়োজনীয় তিনটি স্তরের ডিরেক্টরি কাঠামোর কমপক্ষে একটি উপকরণ সংরক্ষণ করতে হবে। হয়তো আমি তার প্রশ্নের ভুল বোঝাবুঝি করছি।
রবার্ট এস সিয়াস্কিও

@ কালেভারা, ধন্যবাদ - @ মানকফ ঠিক বলেছেন; এটি প্রায় দৈর্ঘ্য।
রিড

3
এটি সম্পাদনা কার্যকারিতাটির কিছুটা অপব্যবহার। আপনি যদি পরে দ্বিতীয় উত্তর প্রস্তাব করতে চান তবে ঠিক এটি করুন। আপনার আসল উত্তরটি সম্পাদনা করবেন না, এটি আপনার নতুন ধারণাটিতে যে ভোট পেয়েছে তা পিগিগ্যাক করছে।
জেফ সোয়েনসেন

1
আমি একমত নই ... উত্তরটি এখনও বেশ একইরকম কারণ তিনি একই বাক্য গঠন ব্যবহার করতেন। কেবল তা-ই নয়, তবে আপ-ভোটাররা যদি নতুন উত্তর পছন্দ না করে তবে তারা তাদের ভোট পরিবর্তন করতে পারবেন কারণ উত্তরটি সম্পাদনা করা হয়েছে। ঠিক এ কারণেই আপনি সম্পাদনার পরে আপনার ভোট পরিবর্তন করতে পারেন। এ কারণেই আমি সাহসী "সম্পাদনা" রাখি।
রবার্ট এস সিয়াসসিও

4

দুটি সমাধান রয়েছে যা আমি ভাবতে পারি:

সহজ উপায় - Info.plistপ্রতিটি। অ্যাপ Contentsডিরেক্টরিতে ফাইল ব্যবহার করে সিএফবান্ডেলএক্সেকটেটেবল কীগুলির জন্য মানের একটি সূচক তৈরি করুন। তারপরে একটি সংক্ষিপ্ত নাম যুক্ত করুন যা একটি এক্সিকিউটেবলের নাম এবং আপনি যে যুক্তিগুলি দিয়ে যেতে চান তার সাথে একটি স্ক্রিপ্ট (পার্ল, পাইথন, যাই হোক না কেন) ডাকে।

আপনার সূচকগুলি এক্সিকিউটেবলের জন্য এক্সিকিউটেবল নাম এবং পাথের জোড়া হবে। এটি আপডেট রাখতে আপনাকে পুনরাবৃত্ত শিডিউল স্ক্রিপ্ট লিখতে হবে।

আপনি কল করতে সক্ষম হবেন:

f foo file.txt

যেখানে f কোনও স্ক্রিপ্টের একটি উপনাম যা কার্যকর করা নামের জন্য আপনার সূচকটি পরীক্ষা করে foo

সব মিলিয়ে আপনার পছন্দসই কার্যকারিতাটি পাওয়ার জন্য খুব বেশি কাজ নয়।

আরও শক্ত উপায় - এর command_not_foundত্রুটিটি পরিচালনা করার জন্য আপনার শেলটি প্রসারিত করুন । মূলত আপনি যে method_missingকোনও শেল ব্যবহার করছেন তার মধ্যে আপনি রুবি স্টাইলের কার্যকারিতা বাস্তবায়ন করবেন । যখন command_not_foundনিক্ষেপ করা হত, তখন আপনার পদ্ধতিটি আপনার ইনস্টলড অ্যাপ্লিকেশনগুলির নির্বাহযোগ্য নাম পরীক্ষা করতে পারে।


2

রেসকিউতে আপেলস্ক্রিপ্ট:

osascript -e 'tell application "iTunes"' -e "activate" -e 'end tell'

আপনি যে অ্যাপ্লিকেশনটি শুরু করতে চান তার সাথে অ্যাপ্লিকেশনটির নামটি প্রতিস্থাপন করুন এবং আপনি হয়ে গেছেন। আপনি প্রয়োজনে অবশ্যই এটি একটি শেল ফাংশন তৈরি করতে পারেন:

function f() {
    osascript <<EOF
tell application "$1"
  activate
end tell
EOF
}

এবং এটি সেভাবে ব্যবহার করুন:

f iTunes

আমি অ্যাপ্লাস্ক্রিপ্টকে ঘৃণা করি, তবে এটি কখনও কখনও দরকারী এবং আমি বিশ্বাস করি যে কমান্ড লাইনে কেবল নাম দ্বারা কোনও অ্যাপ্লিকেশন সম্বোধন করার একমাত্র উপায়। অন্য সমস্ত কিছুর জন্য একটি পূর্ণ পথের প্রয়োজন হবে।


ট্যাব-সমাপ্তি সমর্থন করে না। অ্যাপ্লিকেশন নামগুলি ঠিক মনে রাখার প্রয়োজন remember শেল স্ক্রিপ্টিং যদি এগুলি সব কিছু করতে পারে তবে কেন অ্যাপলস্ক্রিপ্টের প্রয়োজন (বিশেষত আপনি এটি ঘৃণা করেন) তা দেখুন না see

1
আমি কখনই বুঝতে পারি নি যে যুক্তি হিসাবে ফাইলের নাম ছাড়া ওপেন -a ব্যবহার করা যেতে পারে। এবং আমি 90s এর প্রথম দিকে কখনও কখনও NextStep থেকে খোলা ব্যবহার করছি! দয়া করে এটি একটি উত্তর হিসাবে জমা দিন যাতে আমি এটিতে ভোট দিতে পারি। হ্যাঁ, সঠিক উত্তরটি হল 'ওপেন -a <অ্যাপ্লিকেশন নাম>'
এরিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.