නිවැරදි මාර්ගය
gtk-launch
එය ලබා ගත හැකි නම් ඔබ සැබවින්ම භාවිතා කළ යුතුය . එය සාමාන්යයෙන් libgtk-3-bin පැකේජයේ කොටසකි (මෙය ඩිස්ට්රෝ අනුව වෙනස් විය හැකිය).
gtk-launch
පහත පරිදි භාවිතා වේ:
gtk-launch APPLICATION [URI...]
gtk-launch app-name.desktop
gtk-launch app-name
.Desktop ගොනුව ස්ථාපනය කිරීමට gtk-launch
අවශ්ය බව කරුණාවෙන් සලකන්න (එනම් පිහිටා ඇත්තේ හෝ පිහිටා ඇත )./usr/share/applications
~/.local/share/applications
ඒ නිසා මෙම වටා ලබා ගැනීම සඳහා, අප තාවකාලිකව අපේක්ෂිත ස්ථාපනය කරන hackish ටිකක් බෑෂ් ක්රියාව භාවිත කල හැක .desktop ගොනුව එය ආරම්භ කිරීමට ප්රථම. .Desktop ගොනුවක් ස්ථාපනය කිරීම සඳහා "නිවැරදි" ක්රමය හරහා 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
අත්පොත විකල්පය
.Desktop ගොනුවක් අතින් විග්රහ කර ක්රියාත්මක කිරීමට ඔබට අවශ්ය නම්, පහත දැක්වෙන awk
විධානය මඟින් ඔබට එය කළ හැකිය :
awk '/^Exec=/ {sub("^Exec=", ""); gsub(" ?%[cDdFfikmNnUuv]", ""); exit system($0)}' app-name.desktop
ඔබට awk
විධානය සර්ව පාක්ෂික පිටපතක් ලෙස සැලකීමට අවශ්ය නම් ; Exec විධානයක් සොයාගත නොහැකි වූ විට අපට දෝෂ පණිවිඩයක් පෙන්විය හැකි අතර ආපසු 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 = සමඟ ආරම්භ වන රේඛාව සොයා ගන්න
- Exec = ඉවත් කරන්න
- ඕනෑම Exec විචල්යයන් ඉවත් කරන්න (උදා
%f
. %u
, %U
). පිරිවිතරයන් අදහස් කරන පරිදි මේවා ස්ථානීය තර්ක සමඟ ප්රතිස්ථාපනය කළ හැකි නමුත් එසේ කිරීමෙන් ගැටලුවට සැලකිය යුතු සංකීර්ණතාවයක් එකතු වේ. නවතම ඩෙස්ක්ටොප් ප්රවේශ පිරිවිතර බලන්න .
- විධානය ක්රියාත්මක කරන්න
- සුදුසු පිටවීමේ කේතය සමඟ වහාම පිටවන්න (බහු Exec රේඛා ක්රියාත්මක නොකිරීමට )
සටහන, මෙම AWK ස්ක්රිප්ට් වෙනත් පිළිතුරු මගින් නිසි ලෙස ආමන්ත්රණය කළ හැකි හෝ නොකළ හැකි අවස්ථා කිහිපයක් ආමන්ත්රණය කරයි. නිශ්චිතවම, මෙම විධානය මඟින් එක්සෙක් විචල්යයන් කිහිපයක් ඉවත් කරයි (වෙනත් ආකාරයකින්% සංකේතය ඉවත් නොකිරීමට වගබලා ගනී), එක් එක් එක්සෙක් රේඛා විධානයක් පමණක් ක්රියාත්මක කරනු ඇති අතර, එක්සෙක් රේඛා විධානයට සමාන ලකුණක් හෝ වැඩි ගණනක් (උදා script.py --profile=name
) අඩංගු වුවද අපේක්ෂිත පරිදි ක්රියා කරනු ඇත .
තවත් අවවාද කිහිපයක් පමණි ... පිරිවිතරයන්ට අනුව, ට්රයිඑක්සෙක් යනු:
වැඩසටහන සැබවින්ම ස්ථාපනය කර ඇත්දැයි තීරණය කිරීම සඳහා තැටියේ ක්රියාත්මක කළ හැකි ගොනුවකට මාවත. මාර්ගය නිරපේක්ෂ මාර්ගයක් නොවේ නම්, ගොනුව $ PATH පරිසර විචල්යය තුළ සොයා බලයි. ගොනුව නොමැති නම් හෝ එය ක්රියාත්මක කළ නොහැකි නම්, ප්රවේශය නොසලකා හැරිය හැක (උදාහරණයක් ලෙස මෙනු වල භාවිතා නොකරන්න).
එය මනසේ තබාගෙන, එහි වටිනාකම ක්රියාත්මක කිරීම තේරුමක් නැත.
තවත් කරුණු කිහිපයක් වන්නේ මාවත සහ පර්යන්තයයි . මාර්ගය මෙම වැඩසටහන ක්රියාත්මක කිරීමට කම්කරු බහලුම කින් සමන්විත වේ. පර්යන්තය මෙම වැඩසටහන පර්යන්තය කවුළුව තුළ ක්රියාත්මක කර ඇත යන්න පෙන්නුම් කරන වීජ වේ. මේ සියල්ල ආමන්ත්රණය කළ හැකි නමුත් දැනටමත් පිරිවිතර ක්රියාත්මක කර ඇති බැවින් රෝදය ප්රතිනිර්මාණය කිරීමේ තේරුමක් නැත. ඔබට මාර්ගය ක්රියාත්මක කිරීමට අවශ්ය නම් , උප ක්රියාවලියක් ඇති වන බව මතක තබා ගන්න 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
URIs භාවිතා කිරීම අත්යවශ්ය නොවන බව සලකන්න. තවද, කිසිදු දෝෂ පරීක්ෂණයක් සිදු නොකෙරේ, එවිට ඔබේ ස්ක්රිප්ට් කල් පවතින බව ඔබට අවශ්ය නම් දියත් කිරීම පවතින බවත් එය කියවිය හැකි බවත් (එය භාවිතා කිරීමට පෙර) සහතික කිරීමට ඔබට අවශ්ය වනු ඇත.
exec
. ඔබට නොහැකි වීමටsudo exec
හේතුව එය ෂෙල් බිල්ඩින් එකක් මිස ද්විමය විධානයක් නොවේ.