শেল স্ক্রিপ্টে কল মোড়ানোর জন্য কীভাবে একটি ওএসএক্স অ্যাপ্লিকেশন তৈরি করবেন?


10

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

আমার ডিপ্লোয়েবলযোগ্য মূলত এর মতো দেখাচ্ছে:

$ unzip Deliverable.zip 
$ cd Deliverable; ls
app.jar run.sh

স্ক্রিপ্ট এতে run.sh:

#!/bin/sh
java -jar app.jar

ডিরেক্টরিতে আরও অনেক কিছু রয়েছে; বলার অপেক্ষা রাখে না যে আমাকে বিতরণযোগ্য ডিরেক্টরি থেকে স্ক্রিপ্টটি চালানো দরকার কারণ এর সাথে সম্পর্কিত পাথগুলি অ্যাক্সেস করতে আমার প্রয়োজন। তবে, কোনও গ্রাহক কোথায় খুলবেন তা আমি গ্যারান্টি দিতে পারি না Deliverable.zip(হোম ডিরেক্টরি হতে পারে, ডাউনলোড ডিরেক্টরিতে সঠিক হতে পারে ইত্যাদি))

আমি দেখেছি এই বর্ণনা যে Automator একটি নতুন কর্মপ্রবাহ তৈরি করার পদ্ধতি, তারপর একটি শেল স্ক্রিপ্ট আরম্ভ করার জন্য একটি অ্যাপ্লিকেশন হিসাবে সংরক্ষণ করুন। মোড়ানোর জন্য আমি এটি করার চেষ্টা করেছি run.shতবে এটি বলে যে এটি খুঁজে পাচ্ছে না run.sh

কেউ পরামর্শ দিয়েছিল আমি অ্যাপলস্ক্রিপ্ট ব্যবহার করি এবং বর্তমান ডিরেক্টরিতে স্যুইচ করার জন্য অ্যাপলস্ক্রিপ্ট কীভাবে ব্যবহার করতে হয় তার লিঙ্কটিও আমাকে পাঠিয়েছে; অটোমেটরে একটি অ্যাপ্লিক্রিপ্ট "অ্যাকশন" রয়েছে; তাই আমি এটি দিয়ে একটি নতুন ওয়ার্কফ্লো তৈরি করেছি এবং এটি একটি অ্যাপ্লিকেশন হিসাবে সংরক্ষণ করেছি। এটি দেখতে দেখতে এটির মতো:

স্বয়ংক্রিয় অ্যাপলস্ক্রিপ্ট প্রোগ্রাম

কোড:

on run {input, parameters}
    tell application "Finder"
        set current_path to container of (path to me) as alias
    end tell

    do shell script "java -jar app.jar" 

    return input
end run

এবং এটি চালানোর সময় আমি এই ত্রুটিটি পেয়েছি:

2015 এ আপনাকে স্বাগতম

ওমন, এটি বেশ সহজ হওয়া উচিত। আমি এখানে কি ভুল করছি?


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

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

উত্তর:


4

আপনার .sh ফাইলটির নাম। কমন্ডে নতুন নামকরণ করুন এবং আপনি ফাইলটির শুরুতে .command ফাইলটি নিম্নলিখিতটির সাথে থাকা ডিরেক্টরিটিতে সিডি করতে পারেন:

cd "$(dirname $BASH_SOURCE)"

7

আমি সেখানে দুটি জিনিস ভুল দেখতে পারি।

প্রথমত আপনি একটি অ্যাপ্লিকেশন নয়, একটি ওয়ার্কফ্লো খুলেছেন।

আপনি যখন স্বয়ংক্রিয়র ফাইলের ধরণের জন্য নির্বাচন করবেন তখন আপনার অ্যাপ্লিকেশন নির্বাচন করা উচিত।

এখানে চিত্র বর্ণনা লিখুন

এবং আপনার কোডটি আপনার প্রত্যাশার মতো কাজ করবে না, যেহেতু আপনি ডিরেক্টরিটি পরিবর্তন করেন নি। (CD)।

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

তবে আপনি এটি ব্যবহার করবেন না।

সুতরাং বর্তমান ডিরেক্টরি সম্ভবত আপনার হোম ফোল্ডার হবে

এই পর্যায়ে এটি আরম্ভ করার কী চেষ্টা করছে তা বলার অপেক্ষা রাখে না।

আমি যদি এটি চালান তবে এটি আপনার কাছে রয়েছে।

এখানে চিত্র বর্ণনা লিখুন

যেহেতু আমার কাছে জাভা ইনস্টল করা নেই তা বোঝায়। তবে আমি যদি এটি করি তবে এটি সঠিক ফাইলটি খুঁজে পাবে বলে আমি আশা করি না।

অ্যাপসক্রিপ্টটি দেখতে এটির মতো হওয়া দরকার।

on run {input, parameters}
    tell application "Finder"
        set current_path to container of (path to me) as alias
    end tell

    do shell script "cd " & quoted form of (POSIX path of current_path) & " ;ls | open -fe"

    return input
end run 

আমার উদাহরণে

do shell script "cd " & quoted form of (POSIX path of current_path) & " ;/bin/ls | /usr/bin/open -fe"

আমি চলক_পথের চলক_প্যাথের মধ্যে ওরফের POSIX পথে সিডি করেছি

যেমন "ওরফে" ম্যাকিনটোস এইচডি: অ্যাপ্লিকেশন: "" থেকে "/ অ্যাপ্লিকেশন /"

quoted form of পথ কোট ব্যবহার পালাতে।

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

আপনি যেমন কিছু ব্যবহার করবে;

do shell script "cd " & quoted form of (POSIX path of current_path) & " ;\"java -jar app.jar\""

হালনাগাদ:

আরেকটি উপায় হ'ল খাঁটি অ্যাপলস্ক্রিপ্ট ব্যবহার করা।

on run {input, parameters}
    tell application "Finder"
        set current_path to container of (path to me)

        set theFile to (current_path) as alias

        open file "java -jar app.jar" of theFile
    end tell


end run

এটি একটি সমাধানের খুব কাছাকাছি; আমি নিশ্চিত করি ls | openকোডটি অবশ্যই আমার পছন্দসই ডিরেক্টরিটি খুলবে যা দুর্দান্ত। তবে আমি যখন ওপেন কল করি Client.app, তখন আমি পেয়েছি: LSOpenURLsWithRole() failed with error -10665 for the file <path-to-Client.app> - এই ত্রুটিটির অর্থ কী, এর জন্য কয়েকটি অনুসন্ধান কোনও অনুমতি ইস্যুর প্রস্তাব দিয়েছে , আমি চেক করেছি এবং +xপতাকাগুলি সেট করা আছে। আমিও চেষ্টা এই , এবং যে কাজ (একই ভুল সহ) না।
emptyset

নোট করুন যে Client.appফাইন্ডার থেকে খোলার (ডাবল ক্লিক করুন) একই পাওয়ারপিসির ত্রুটি পপ-আপের ফলাফল।
emptyset

@emptyset এটি I call open Client.appকি অটোমেটার অ্যাপ্লিকেশন। কি আমি Automator বুঝতে থেকে আপনি applescript কোড আছে: do shell script "cd " & quoted form of (POSIX path of current_path) & " ;\"java -jar app.jar\""। তাহলে আপনি openকমান্ডটি কোথায় ব্যবহার করছেন ? যা আমি যতদূর বুঝতে পারি আপনি কী করছেন, আপনার এটি ব্যবহার করার দরকার নেই। ক্লায়েন্টরা অ্যাপটিতে ডাবল ক্লিক ব্যবহার করবে এবং অ্যাপটি জাভা
মার্খুંટ

আমি এটি উভয়ভাবেই পরীক্ষা করেছি: কমান্ড লাইন থেকে: $ open Client.appএবং ডাবল-ক্লিক করে। ls | open -feআমন্ত্রণমূলক আপনার সংস্করণ কাজ করে, কিন্তু আমি যখন এটির পরিবর্তিত করি তখন java -jar app.jarতা আমাকে ত্রুটি দেয়।
খালি

@ এমপিটিসেট চেষ্টা করুনdo shell script "cd " & quoted form of (POSIX path of current_path) & " ; " & quoted form of "java -jar app.jar"
মার্চুন্তে

6

স্ক্রিপ্টের পথে

আপনার অ্যাপলস্ক্রিপ্টে জাভা কমান্ড দেওয়ার আগে আপনাকে বর্তমান ওয়ার্কিং ডিরেক্টরি (সিডব্লু) পরিবর্তন করতে হবে । অ্যাপলস্ক্রিপ্ট লাইন দিয়ে এটি করুন:

do shell script "cd " & quoted form of (POSIX path of file_path) & " && java -jar app.jar"

&&গুরুত্বপূর্ণ। যদি cdসফল হয়, javaডান সিডব্লিউডের মধ্যে কমান্ডটি চালু করা হবে । যদি cdব্যর্থ হয়, javaকমান্ডটি চালানো হবে না।

আপনার মুখোমুখি হওয়া সমস্যাগুলির মধ্যে রয়েছে:

  • POSIX পথ থেকে দূরে চলে গেছে cd; ব্যবহারকারীদের তাদের পথে অদ্ভুতভাবে নামযুক্ত ফোল্ডার এবং স্পেস রাখতে হবে।
  • cdব্যর্থ হতে পারে; কিছু ত্রুটি ধরার জন্য এবং ব্যবহারকারীকে সতর্ক করার জন্য আপনার অ্যাপলস্ক্রিপ্টটিকে একটি চেষ্টা ব্লকে জড়িয়ে রাখুন ।

Perl

ব্যক্তিগতভাবে, আমি ব্যাশ স্ক্রিপ্টের জায়গায় একটি শর্ট পার্ল স্ক্রিপ্ট ব্যবহার করব।

#!/usr/bin/env perl

use strict;
use warnings;
use FindBin qw($Bin); # $Bin is a path to the script's parent folder

`cd "$Bin" && java -jar app.jar`;

এই পার্ল স্নিপেট লেখার আরও অনেক ভাল উপায় আছে তবে এটি কাজ করা উচিত।

অটোমেটর অ্যাপ্লিকেশন

আপনার অটোমেটর পদ্ধতির সাথে সমস্যার মধ্য দিয়ে কাজ করা সর্বোত্তম পন্থা। @ মারখুন্তির উত্তর কীভাবে পথ ঠিক করতে এবং একটি অ্যাপ্লিকেশন তৈরি করবেন তা আলোচনা করে । এটি আপনাকে বেশিরভাগ পথে পাওয়া উচিত।

স্ক্রিপ্ট অবস্থান সম্পর্কিত আপেলস্ক্রিপ্ট পাথ দেখুন ।

appify - শেল স্ক্রিপ্ট থেকে সহজতম ম্যাক অ্যাপ তৈরি করুন

বিকল্পভাবে, আপনি আপনার শেল স্ক্রিপ্টটি কোনও ওএস এক্স অ্যাপ্লিকেশনে বান্ডিল করার জন্য টমাস অাইলটের অ্যাপিফাই স্ক্রিপ্টটি ব্যবহার করতে পারেন । ম্যাথিয়াস ব্যেনেনের নিবন্ধটি কীভাবে স্ক্রিপ্টটি ব্যবহার করবেন, কীভাবে শেল স্ক্রিপ্ট থেকে সহজ ম্যাক অ্যাপস তৈরি করবেন তা নিয়ে হাঁটেন ।

#!/bin/bash

if [ "$1" = "-h" -o "$1" = "--help" -o -z "$1" ]; then cat <<EOF
appify v3.0.1 for Mac OS X - http://mths.be/appify
Creates the simplest possible Mac app from a shell script.
Appify takes a shell script as its first argument:
    `basename "$0"` my-script.sh
Note that you cannot rename appified apps. If you want to give your app
a custom name, use the second argument:
    `basename "$0"` my-script.sh "My App"
Copyright (c) Thomas Aylott <http://subtlegradient.com/>
Modified by Mathias Bynens <http://mathiasbynens.be/>
EOF
exit; fi

APPNAME=${2:-$(basename "$1" ".sh")}
DIR="$APPNAME.app/Contents/MacOS"

if [ -a "$APPNAME.app" ]; then
    echo "$PWD/$APPNAME.app already exists :("
    exit 1
fi

mkdir -p "$DIR"
cp "$1" "$DIR/$APPNAME"
chmod +x "$DIR/$APPNAME"

echo "$PWD/$APPNAME.app"

এই স্ক্রিপ্টে সম্প্রদায় অবদানের উন্নতিগুলি উপলভ্য:

কোড সাইন ইন

একবার আপনি নিজের অ্যাপ্লিকেশন বান্ডেলটি তৈরি করার পরে এটি কোড স্বাক্ষরিত হওয়া উচিত । একটি কোড স্বাক্ষরিত অ্যাপ্লিকেশন আপনার ক্লায়েন্টদের গেটকিপার অক্ষম করার প্রয়োজন ছাড়াই চালু করবে।

কোড আপনার অ্যাপল বিকাশকারী আইডি এবং codesignকমান্ডটি ব্যবহার করে আপনার অ্যাপ্লিকেশনটিতে স্বাক্ষর করে :

codesign -s <identity> -v <code-path> 

কোড সাইন ইন করা একটি সুরক্ষা প্রযুক্তি, যা ওএস এক্স-এ ব্যবহৃত হয়, যা আপনাকে এটি প্রমাণ করার অনুমতি দেয় যে কোনও অ্যাপ্লিকেশন আপনার দ্বারা তৈরি করা হয়েছিল। একবার কোনও অ্যাপ্লিকেশন স্বাক্ষরিত হয়ে গেলে, সিস্টেমটি অ্যাপটিতে যে কোনও পরিবর্তন সনাক্ত করতে পারে accident পরিবর্তনটি দুর্ঘটনাক্রমে বা দূষিত কোডের মাধ্যমে প্রবর্তিত কিনা।

অ্যাপল বিকাশকারী সাইটে কোড সাইনিং সম্পর্কে আরও জানুন ।


কোড সাইন ইন টিপ জন্য ধন্যবাদ; আমি এখন এটি সন্ধান করছি এবং অ্যাপ্লাইফ স্ক্রিপ্ট পরীক্ষা করছি!
ফাঁকা সেট

স্ক্রিপ্ট স্ক্রিপ্ট কার্যকর হয়নি; একই পথ ইস্যু
খালি

@Emptyset আমি একটি পথ এবং পার্ল বিভাগ যুক্ত করেছি। এটি একটি নতুন প্রশ্নের মধ্যে পাথ সমস্যাটি আলাদা করার উপযুক্ত হতে পারে। যদি আপনি এটি ঠিক করতে পারেন তবে আপনি অটোমেটার বা অ্যাপ্লিকেশন স্ক্রিপ্টটি ব্যবহার করতে পারেন।
গ্রাহাম মিলন


4

আপনি পরিবর্তন করতে পারি run.shকরতে run.commandএবং ডাবল এটি ক্লিক ব্যবহারকারীর পেতে?


প্রায় কাজ! তবে এটি ব্যবহারকারীর হোম ডিরেক্টরি ( cd ~) এর প্রসঙ্গ থেকে ফাইলটি চালিয়েছে , যার ফলে এটি ব্যর্থ হয়েছিল।
ফাঁকা সেট

1
@ এমপিটিসেট ব্যবহার করুন AS BASH_SOURCE, দেখুন Apple.stackexchange.com/a/201482
grg

1

আপনি যা অর্জন করতে চাইছেন তা আমি এখানে নিয়েছি। কোডটি উদ্দেশ্য অনুযায়ী দীর্ঘায়িত।

আপনাকে যা করতে হবে তা হ'ল অ্যাপ্লস্ক্রিপ্ট সম্পাদককে কোডটি অনুলিপি করা, আপনার যে কোনও পরিবর্তন করা এবং এটি অ্যাপ্লিকেশন হিসাবে সেভ করা।

পাওয়ারপিসি অ্যাপ্লিকেশন সম্পর্কে ডায়ালগটি সমর্থিত নয়, আমি জানি না। আপনি এটি কমান্ড লাইন থেকে চালাতে পারেন? অ্যাপটি প্রথম কাজ করে তা নিশ্চিত করার জন্য আমি এটি যাচাই করব।

#
# STEP 1: locate and confirm zip file exists
#
#   This is long winded on purpose. It is meant to save the user some scrolling and 
#   and a click... Isn't this what computers are for to save time? :)
#

# Zip file name 
set zipname to "Deliverable.zip"

# Locate the zip file
set zippath to POSIX path of (choose folder)
log zippath
set qzippath to quoted form of zippath
log qzippath
set zipfile to (zippath & zipname)
set qzipfile to quoted form of (zippath & zipname)
log qzipfile

# Check for the file... Use either test not both :)
try
    # using shell test - case sensetive
    do shell script "test -f " & qzipfile

    # using native test - doesn't like quoted forms and case insensetive...
    POSIX file zipfile as alias
on error
    display dialog "ERROR: Zip file was not found at selected folder." as text ¬
        buttons {"OK"} with icon caution ¬
        with title "Alert"
    return
end try


#
# STEP 2: Zip found. Unzip it
#
try
    # Add " -d Deliverable" at the end to force directory  
    # unzip -o to force overwrite for testing....
    do shell script "cd " & qzippath & "; unzip -o " & zipname
on error eStr
    display dialog "ERROR: Failed to unzip file. Message returned was, " & ¬
        return & return & eStr as text ¬
        buttons {"OK"} with icon caution ¬
        with title "Unzip Error"
    return
end try


#
# STEP 3: Run script 
#
set dpath to (zippath & "Deliverable/")
log dpath
set qdpath to quoted form of dpath
log qdpath
try
    do shell script "cd " & qdpath & ";  sh ./run.sh"
on error eStr
    display dialog "ERROR: Failed to launch script. Message returned was, " & ¬
        return & return & eStr as text ¬
        buttons {"OK"} with icon caution ¬
        with title "Deliverable Script Launch"
    return
end try
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.