সঠিক পথ
gtk-launch
এটি উপলব্ধ থাকলে আপনার ব্যবহার করা উচিত । এটি সাধারণত libgtk-3-bin প্যাকেজের অংশ (এটি ডিস্ট্রো অনুসারে পৃথক হতে পারে)।
gtk-launch
নিম্নলিখিত হিসাবে ব্যবহৃত হয়:
gtk-launch APPLICATION [URI...]
gtk-launch app-name.desktop
gtk-launch app-name
দয়া করে মনে রাখবেন gtk-launch
প্রয়োজন .desktop ইনস্টল করার জন্য ফাইল (অর্থাত অবস্থিত /usr/share/applications
বা ~/.local/share/applications
)।
সুতরাং এটি পেতে, আমরা একটি হ্যাকিশ লিটল ব্যাশ ফাংশন ব্যবহার করতে পারি যা কাঙ্ক্ষিত .ডেস্কটপ ফাইলটি আরম্ভ করার আগে অস্থায়ীভাবে ইনস্টল করে । .ডেস্কটপ ফাইল ইনস্টল করার "সঠিক" উপায়টিdesktop-file-install
কিন্তু আমি তা এড়িয়ে যাচ্ছি।
launch(){
# Usage: launch PATH [URI...]
# NOTE: The bulk of this function is executed in a subshell, i.e. `(..)`
# This isn't strictly necessary, but it keeps everything
# out of the global namespace and lessens the likelihood
# of side effects.
(
# where you want to install the launcher to
appdir=$HOME/.local/share/applications
# the template used to install the launcher
template=launcher-XXXXXX.desktop
# ensure $1 has a .desktop extension, exists, is a normal file, is readable, has nonzero size
# optionally use desktop-file-validate for stricter checking
# desktop-file-validate "$1" 2>/dev/null || {
[[ $1 = *.desktop && -f $1 && -r $1 && -s $1 ]] || {
echo "ERROR: you have not supplied valid .desktop file" >&2
return 1
}
# ensure the temporary launcher is deleted upon exit
trap 'rm "$launcherfile" &>/dev/null' EXIT
# create a temp file to overwrite later
launcherfile=$(mktemp -p "$appdir" "$template")
launchername=${launcherfile##*/}
# overwrite temp file with the launcher file
if cp "$1" "$launcherfile" &>/dev/null; then
gtk-launch "$launchername" "${@:2}"
else
echo "ERROR: failed to copy launcher to applications directory" >&2
return 1
fi
)
}
আপনি এটির মতো এটি ব্যবহার করতে পারেন (এবং আপনি চাইলে অতিরিক্ত যুক্তি বা ইউআরআইও দিয়ে যান):
launch PATH [URI...]
launch ./path/to/shortcut.desktop
ম্যানুয়াল বিকল্প
আপনি যদি একটি। ডেস্কটপ ফাইল ম্যানুয়ালি বিশ্লেষণ এবং সম্পাদন করতে চান তবে আপনি নিম্নলিখিত awk
আদেশটি দিয়ে এটি করতে পারেন :
awk '/^Exec=/ {sub("^Exec=", ""); gsub(" ?%[cDdFfikmNnUuv]", ""); exit system($0)}' app-name.desktop
আপনি যদি awk
কমান্ডটিকে সর্ব-ও-ওয়ান স্ক্রিপ্টের মতো আচরণ করতে চান ; এমনকি আমরা একটি ত্রুটি বার্তা প্রদর্শন করতে পারি এবং এক্সিকিউট কমান্ড না পাওয়া ইভেন্টে 1 এর রিটার্ন কোড সহ প্রস্থান করতে পারি :
awk 'BEGIN {command=""} /^Exec=/ {sub("^Exec=", ""); gsub(" ?%[cDdFfikmNnUuv]", ""); command=$0; exit} END {if (command!="") {exit system(command)} else {if (FILENAME == "-") {printf "ERROR: Failed to identify Exec line\n" > "/dev/stderr"} else {printf "ERROR: Failed to identify Exec line in \047%s\047\n", FILENAME > "/dev/stderr"} close("/dev/stderr"); exit 1}}'
পূর্বোক্ত আদেশগুলি হ'ল:
- এক্সেক = দিয়ে শুরু করে লাইনটি সন্ধান করুন
- এক্সেক = সরান
- কোনো Exec এর ভেরিয়েবল সরান (যেমন
%f
, %u
, %U
)। নির্দিষ্টকরণের ইচ্ছার সাথে এগুলি স্থিতিগত যুক্তিগুলির সাথে প্রতিস্থাপন করা সম্ভব তবে এটি করা সমস্যার সাথে উল্লেখযোগ্য জটিলতা যুক্ত করবে। সর্বশেষতম ডেস্কটপ এন্ট্রি স্পেসিফিকেশন দেখুন ।
- কমান্ড কার্যকর করুন
- তাত্ক্ষণিকভাবে উপযুক্ত প্রস্থান কোড সহ প্রস্থান করুন (যাতে একাধিক এক্সিক লাইনগুলি কার্যকর করা যায় না )
দ্রষ্টব্য, এই AWK স্ক্রিপ্টটি কয়েকটি প্রান্তের কেসগুলিতে সম্বোধন করে যা অন্য কয়েকটি উত্তরের মাধ্যমে সঠিকভাবে সম্বোধন করতে পারে বা নাও পারে। বিশেষত, এই কমান্ডটি একাধিক এক্সিক ভেরিয়েবলগুলি সরিয়ে দেয় (অন্যথায়% চিহ্নটি সরিয়ে না নেওয়ার বিষয়ে যত্ন নিচ্ছে), কেবলমাত্র একক এক্সাইন লাইন কমান্ড কার্যকর করবে এবং এক্সেক লাইন কমান্ডে এক বা একাধিক সমান চিহ্ন (উদাঃ script.py --profile=name
) উপস্থিত থাকলেও প্রত্যাশা অনুযায়ী আচরণ করবে ।
মাত্র কয়েকটি অন্যান্য সতর্কতা ... স্পেসিফিকেশন অনুসারে ট্রাইএক্সেক হ'ল:
প্রোগ্রামটি আসলে ইনস্টল করা আছে কি না তা নির্ধারণ করতে ব্যবহৃত ডিস্কে একটি এক্সিকিউটেবল ফাইলের পাথ। যদি পথটি কোনও পরম পাথ না হয় তবে ফাইলটি $ PATH এনভায়রনমেন্ট ভেরিয়েবলের মধ্যে দেখা যাবে। যদি ফাইলটি উপস্থিত না থাকে বা যদি এটি কার্যকর না হয় তবে এন্ট্রি উপেক্ষা করা হতে পারে (উদাহরণস্বরূপ মেনুতে ব্যবহৃত হবে না)।
এটি মনে রেখে, এটির মানটি কার্যকর করার কোনও মানে হয় না।
কিছু অন্যান্য উদ্বেগ হ'ল পাথ এবং টার্মিনাল । প্রোগ্রামটি চালানোর জন্য পাথ ওয়ার্কিং ডিরেক্টরি নিয়ে গঠিত consists টার্মিনালটি একটি বুলিয়ান যা প্রোগ্রামটি টার্মিনাল উইন্ডোতে চালিত হচ্ছে কিনা তা নির্দেশ করে। এগুলিকেই সম্বোধন করা যেতে পারে তবে চাকাটির পুনর্বিবেচনা করার কোনও বুদ্ধি নেই কারণ ইতিমধ্যে অনুমানের বাস্তবায়ন রয়েছে। আপনি যদি পথটি বাস্তবায়ন করতে চান তবে মনে রাখবেন যে system()
একটি উপ-প্রসেস তৈরি হয়েছে, সুতরাং আপনি এর মতো কিছু করে কাজ ডিরেক্টরি পরিবর্তন করতে পারবেন না system("cd \047" working_directory "\047"); system(command)
। তবে আপনি সম্ভবত এরকম কিছু করতে পারেন system("cd \047" working_directory "\047 && " command)
। দ্রষ্টব্য \ 047 একক উদ্ধৃতি (যাতে কমান্ডটি ফাঁকা জায়গাগুলির সাথে পাথগুলিতে ভেঙে না)।
পাইথন বিকল্প
আমি এখানে কার্লো থেকে একটি পৃষ্ঠা চুরি করছি , যিনি জিআই মডিউলটি ব্যবহার করার জন্য পাইথন স্ক্রিপ্ট তৈরি করার পরামর্শ দিয়েছেন । ফাইল তৈরি না করে শেল থেকে একই কোডটি কার্যকর করতে এবং I / O সম্পর্কে চিন্তিত করার একটি ন্যূনতম উপায়।
launch(){
# Usage: launch PATH [URI...]
python - "$@" <<EOF
import sys
from gi.repository import Gio
Gio.DesktopAppInfo.new_from_filename(sys.argv[1]).launch_uris(sys.argv[2:])
EOF
}
তারপরে নীচে লঞ্চার ফাংশনটি সম্পাদন করুন:
launch ./path/to/shortcut.desktop
নোট করুন ইউআরআই ব্যবহার optionচ্ছিক। এছাড়াও, কোনও ত্রুটি যাচাই করা হয় নি তাই আপনি যদি আপনার স্ক্রিপ্টটি টেকসই করতে চান তবে লঞ্চটি বিদ্যমান এবং এটি পাঠযোগ্য (এটি ব্যবহারের আগে) নিশ্চিত করতে চাইবেন।
exec
ব্যর্থ হওয়ার কারণ হ'ল এক্সিকিউটর আপনার বর্তমানে চলমান প্রক্রিয়াটি আপনার নির্দিষ্ট করা প্রক্রিয়াটির সাথে প্রতিস্থাপন করে, তাই আপনি যা করেছিলেন তা আপনার শেলটিকে একটি সংকলিত বাইনারি হিসাবে ডেস্কটপ চালানোর সাথে প্রতিস্থাপন করার চেষ্টা করা হয়েছিল। আপনি না পারারsudo exec
কারণ এটি শেল বিল্টিন এবং বাইনারি কমান্ড নয়।