क्या GUI आधारित अनुप्रयोग पृष्ठभूमि में शेल कमांड निष्पादित करता है?


29

मैं विंडोज से सिर्फ 2 दिन पहले उबंटू 16.04 में प्रवास कर चुका हूं। मुझे एकता डेस्कटॉप को अनुकूलित करने का तरीका पसंद है। मैं सिर्फ डेस्कटॉप वातावरण के लुक और फील के साथ खेल रहा हूं। विंडोज की तरह, मैं चाहता था कि लांचर स्क्रीन के निचले भाग में हो। Googling पर, मुझे एक कमांड मिली, जो इस प्रकार है:

gsettings set com.canonical.Unity.Launcher launcher-position Bottom

इसके अलावा, काम करने के लिए एकता-ट्वीक-टूल और डॉन्कफ संपादक हैं। लेकिन ये चीजें हासिल करने के लिए जीयूआई दृष्टिकोण हैं।

मेरे प्रश्न हैं:

  • क्या ये GUI- आधारित अनुप्रयोग भी पृष्ठभूमि में एक ही कमांड निष्पादित करते हैं?
  • इन अनुप्रयोगों के आंतरिक काम पर एक झलक कैसे है? मेरा मतलब है, क्या वास्तव में बटन के प्रत्येक क्लिक पर निष्पादित होने वाली कमांड को देखने का कोई तरीका है?
  • क्या ये एप्लिकेशन पृष्ठभूमि में एक टर्मिनल खोलते हैं और इन आदेशों को निष्पादित करते हैं?

इस सवाल का जवाब यहाँ बताता है कि कैसे प्रक्रिया के मानक फ़ाइल वर्णनकर्ता मिलता है। लेकिन, मुझे आउटपुट में कुछ नहीं मिला।

इसके अलावा, strace -p pid -o output.txtकमांड फाइल में बड़ी मात्रा में टेक्स्ट फेंकता है।

तो, संक्षेप में, जीयूआई अनुप्रयोगों का उपयोग कमांड लाइन से सामान करने के रूप में कर रहा है?

जवाबों:


35

क्या ये GUI- आधारित अनुप्रयोग भी पृष्ठभूमि में एक ही कमांड निष्पादित करते हैं?

हां और ना। वे dconfसेटिंग्स के डेटाबेस को लिखते हैं, लेकिन वे ऐसा करने के लिए विभिन्न तरीकों का उपयोग कर सकते हैं। पायथन में लिखे गए कार्यक्रमों में संभवतः gi.repository.Gioमॉड्यूल का उपयोग किया जाएगा (मुझे पता है क्योंकि मैं इसे बहुत उपयोग करता हूं) या वे gsettingsकॉल करके बाहरी कमांड के रूप में उपयोग कर सकते हैं subprocess.Popen(['gsettings','org.some.schema','some-key','value']), और यह मूल रूप से शेल कमांड के रूप में चलेगा। एसी प्रोग्राम कुछ इसी तरह का उपयोग करेगा, एक gio.hपुस्तकालय की संभावना है , या यह exec()कार्य के परिवार का उपयोग भी कर सकता है जैसा Popenकि अजगर में करता है। तो अपने शीर्षक प्रश्न का उत्तर देने के लिए: "क्या जीयूआई आधारित अनुप्रयोग पृष्ठभूमि में शेल कमांड निष्पादित करता है?" वे कर सकते हैं, लेकिन संभवत: यह आवश्यक नहीं है क्योंकि जो भी भाषा उस ऐप के लिए लिखी जाती है उसके लिए एक पुस्तकालय होता है, और संभवत: यह एक लाइब्रेरी फ़ंक्शन का उपयोग करने के लिए एक नई प्रक्रिया को जन्म देने की तुलना में थोड़ा तेज होने वाला है।

आपको लाइब्रेरी / मॉड्यूल के साथ यह कैसे किया जाता है, इसका एक नमूना देने के लिए, मेरे लॉन्चर सूची संकेतक के स्रोत कोड पर एक नज़र डालने के लिए स्वतंत्र महसूस करें वहां मैंने Gio.Settingsकक्षा का एक उदाहरण बनाने के लिए एक फ़ंक्शन लिखा है और फिर इसका उपयोग आप जिस प्रकार की सूची में करना चाहते हैं उसके आधार पर एकता लांचर को संशोधित करने के लिए कर सकते हैं।

इन अनुप्रयोगों के आंतरिक काम पर एक झलक कैसे है? मेरा मतलब है कि क्या वास्तव में बटन के प्रत्येक क्लिक पर निष्पादित होने वाली कमांड को देखने का कोई तरीका है?

नहीं। यदि आप यह देखना चाहते हैं कि उस ऐप की प्रोग्रामिंग लैंग्वेज में कौन सी कमांड जारी की गई है जैसे आप एक बटन दबाते हैं या विंडो एलिमेंट्स पर क्लिक करते हैं, तो यह संभव नहीं है। आवेदन का स्रोत कोड पढ़ें, अगर इसे प्राप्त करना संभव है। आप यह dconf watch /देखने के लिए उपयोग कर सकते हैं कि सेटिंग्स क्या बदली जा रही हैं, लेकिन यह नहीं कि यह कैसे किया जाता है।

तकनीकी रूप से, यदि आप डिबगर को संचालित करना जानते हैं, मेमोरी एड्रेस पढ़ते हैं, और कुछ असेंबली भाषा जानते हैं, तो आप यह जान सकते हैं कि सीपीयू और मेमोरी स्तर पर कोई ऐप क्या करता है। यह सॉफ्टवेयर रिवर्स इंजीनियरिंग के रूप में जाना जाता है और अक्सर दुर्भावनापूर्ण सॉफ़्टवेयर का विश्लेषण करने और वैध सॉफ़्टवेयर में कमजोरियों का पता लगाने के लिए सुरक्षा पेशेवरों द्वारा उपयोग किया जाता है।

क्या ये एप्लिकेशन पृष्ठभूमि में एक टर्मिनल खोलते हैं और इन आदेशों को निष्पादित करते हैं?

नहीं, कोई टर्मिनल संलग्न नहीं है। कई कार्यक्रमों को पता है dconfकि उपयोगकर्ता के लिए डेटाबेस कहां स्थित है और वहां लिखें। एक अंतर-प्रक्रिया संचार बस के रूप में भी जाना जाता है dbus, जहां कार्यक्रम संकेत भेज सकते हैं, और एक कार्यक्रम "अरे, यह मेरे लिए एक संदेश है!"

परिशिष्ट

  • क्या अन्य अनुप्रयोग चला सकते हैं? हां, यह मानक fork()और execve()सिस्टम कॉल के माध्यम से किया जाता है । लिनक्स और अन्य * निक्स सिस्टम पर प्रक्रियाएं बनाने का सार काफी हद तक इन दोनों पर आधारित है। गैर-अंतर्निहित कमांड चलाने के लिए शेल तंत्र विशेष रूप से बहुत अधिक उपयोग करता है। जब आप सहभागी होते हैं

    $ ls 
    

    शेल एक नई प्रक्रिया बनाएगा fork(), जिसके द्वारा यह प्रक्रिया चलेगी execve() जो शुरू होगी ls। क्योंकि execve()उस नई कांटे की प्रक्रिया कैसी होगी lspipe()सिस्टम कॉल क्या मदद मिलेगी के उत्पादन में वापस पढ़ें है ls। मैं दृढ़ता से अपना जवाब पढ़ने के लिए सुझाव देता हूं कि पाइप और रीडायरेक्शन के बीच अंतर क्या है यह समझने के लिए कि पाइप तंत्र कैसे काम करता है - यह सिर्फ |ऑपरेटर नहीं है , बल्कि वास्तव में एक syscall है।

  • क्या एप्लिकेशन शेल कमांड चला सकते हैं? शेल शेल सिंटैक्स केवल शेल द्वारा ही समझा जाता है। हालाँकि, आप क्या कर सकते हैं, कमांड-लाइन -cस्विच के साथ एक शेल शुरू करें और उचित कमांड प्रदान करें। यह अक्सर गनोम या अन्य डेस्कटॉप वातावरण में सेट किए गए कस्टम शॉर्टकट के लिए उपयोग किया जाता है, क्योंकि कस्टम शॉर्टकट निष्पादन योग्य पर काम करते हैं और वाक्यविन्यास को समझने के लिए कोई शेल नहीं है। इस प्रकार एक उदाहरण के रूप में, आप bash -c 'xdotool key Ctrl+Alt+T'परोक्ष रूप से xdotoolकमांड चलाने या bash -c 'cd $HOME/Desktop; touch New_File'शॉर्टकट के माध्यम से डेस्कटॉप पर नई फ़ाइल बनाने के लिए करेंगे। यह विशेष रूप से दिलचस्प उदाहरण है क्योंकि आप एक शेल चर का उपयोग कर सकते हैं, क्योंकि आप एक शेल का स्पष्ट रूप से उपयोग कर रहे हैं।


2
विस्तृत विवरण और प्रत्येक प्रश्न का अलग-अलग और व्यवस्थित रूप से जवाब देने के लिए बहुत बहुत धन्यवाद @ शेर!
पीटमदेवनकोडर

मेरी खुशी, हमेशा मदद करने के लिए :) खुश @Logan
सर्गी Kolodyazhnyy

1
सौभाग्य से, उल्लिखित टूल के लिए स्रोत उपलब्ध है क्योंकि वे FLOSS हैं। इसलिए मैं कहूंगा कि इस मामले में उन्हें उलटना थोड़ा भारी है। :)
एंड्रिया लेज़ारोत्तो

1
@AndreaLazzarotto हां, यूनिटी ट्वीक टूल और डॉन्कफ संपादक - वे ओपन सोर्स हैं, इसलिए उन लोगों को रिवर्स इंजीनियर करने की कोई आवश्यकता नहीं है। मेरे उत्तर में मैंने सब कुछ बहुत सामान्य रखा और न केवल उन साधनों को कवर करने की कोशिश की, बल्कि अन्य संभावनाएं भी
थीं

GUI अनुप्रयोगों के लिए तेज़ शायद ही बिंदु है। शेल टूल के साथ उपयोग के लिए मूल्यों को बचाना या मार्श करना थकाऊ है, गलत और व्यर्थ हो जाना आसान है यदि आप बस लाइब्रेरी का उपयोग कर सकते हैं। डीबगिंग: यदि एप्लिकेशन डीबग प्रतीकों के साथ स्थापित है और gdb द्वारा समर्थित भाषा में लिखा गया है (इसी प्रकार -Dbg पैकेज स्थापित करके डेबियन पर), तो आपको कोडांतरक को जानने की आवश्यकता नहीं है: gdb आपको स्रोत कोड का उपयोग करके दिखाएगा डिबग जानकारी जब आप अनुप्रयोग के माध्यम से कदम। उबाऊ GUI बॉयलरप्लेट की वजह से डिबगिंग शुरू करने के लिए एक उचित प्रवेश बिंदु खोजना मुश्किल होगा।
जोनास शोफर

21

जो होता है, उस पर जासूसी करना

इन सेटिंग्स संपादकों में से अधिकांश को चलाकर देखा जा सकता है

dconf watch /

एक टर्मिनल में।

gsettings

इसके अलावा, यह समझने के लिए कि ऊपर दिए गए आदेश के साथ आप क्या देख रहे हैं, इन अनुप्रयोगों को dconfडेटाबेस को संपादित करने की आवश्यकता होगी (आगे नीचे)। यह या तो सीधे किया जा सकता है , dconf (जो पसंदीदा नहीं है) के cli विकल्पों का उपयोग करके , या संबंधित gsettingsआदेशों को चलाकर , जैसे आप उल्लेख करते हैं।

इन आदेशों को चलाने के लिए, कोई टर्मिनल विंडो की आवश्यकता नहीं है, जैसा कि आप उदाहरणों में देख सकते हैं।

Gsettings, dconf और dconf डेटाबेस के बारे में

gsettingsयह क्लीव फ्रंटेंड है dconf, जो अपनी बारी में dconfडेटाबेस को संपादित करता है, जहां अधिकांश सेटिंग्स बाइनरी प्रारूप में संग्रहीत की जाती हैं। यह अच्छा जवाब भी देखें ।

dconfडेटाबेस, वैसे, भी द्वारा जीयूआई से संपादित किया जा सकता dconfसंपादक, जो खजाने में है:

यहां छवि विवरण दर्ज करें

काम के नमूने

ए। अजगर में

यहां छवि विवरण दर्ज करें

आपको यह दिखाने के लिए कि एक एकल (टॉगल) बटन में GUI से अपने लॉन्चर की स्थिति को टॉगल करने के लिए एक काम के नमूने के नीचे हुड के नीचे क्या होता है:

#!/usr/bin/env python3
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
import subprocess

key = ["com.canonical.Unity.Launcher", "launcher-position"]

class ToggleWin(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Toggle")
        button = Gtk.Button("Toggle launcherposition")
        button.connect("clicked", self.toggle)
        self.add(button)

    def toggle(self, *args):
        # read the current setting on launcher position
        current = subprocess.check_output([
            "gsettings", "get", key[0], key[1]
            ]).decode("utf-8").strip()
        # toggle to the other option
        new = "'Left'" if current == "'Bottom'" else "'Bottom'"
        subprocess.Popen([
            "gsettings", "set", key[0], key[1], new
            ])

def delete_actions(*args):
    Gtk.main_quit()

def miniwindow():
    window = ToggleWin()
    window.connect("destroy", delete_actions)
    window.show_all()
    Gtk.main()

miniwindow()
  • कोड को एक खाली में चिपकाएँ file.py
  • इसे कमांड द्वारा चलाएं:

    python3 /path/to/file.py
    

...और मजा करो।

ख। लॉन्चर आइकन

यहां तक ​​कि एक साधारण लांचर भी GUI से काम कर सकता है:

यहां छवि विवरण दर्ज करें

[Desktop Entry]
Name=Set launcherposition
Exec=zenity --info --text="Right- click to set launcher position"
Type=Application
StartupNotify=False
Icon=preferences-system

Actions=Launcher to bottom;Launcher on the left;

[Desktop Action Launcher to bottom]
Name=Launcher to bottom
# right click option to set launcher to bottom
Exec=gsettings set com.canonical.Unity.Launcher launcher-position Bottom

[Desktop Action Launcher on the left]
Name=Launcher on the left
# right click option to set launcher to left
Exec=gsettings set com.canonical.Unity.Launcher launcher-position Left
  • एक खाली फ़ाइल में कोड पेस्ट करें, इसे सहेजें setlauncher.desktop
  • इसे लॉन्चर पर खींचें और राइट-क्लिक करें

स्थायी उपयोग के लिए, इसे ~/.local/share/applications(स्थानीय उपयोग के लिए) या ~/usr/share/applicationsसभी उपयोगकर्ताओं के लिए संग्रहीत करें ।


@ लोगन इसका उल्लेख नहीं करते हैं :)
जैकब व्लिजम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.