Z Windows jsem před 2 dny migroval na Ubuntu 16.04. Líbí se mi způsob, jakým si můžeme přizpůsobit plochu Unity. Jen si hraji se vzhledem a dojmem prostředí Desktop. Stejně jako ve Windows jsem chtěl, aby spouštěč byl ve spodní části obrazovky. Na Googlu jsem našel příkaz, který vypadá takto:
gsettings set com.canonical.Unity.Launcher launcher-position Bottom
K dispozici je také nástroj unity-tweak a editor dconf, který tuto práci zvládne. Ale toto je přístup GUI, jak věci dokončit.
Moje otázky jsou:
- Provádějí tyto aplikace založené na grafickém uživatelském rozhraní také stejný příkaz na pozadí?
- Jak nahlédnout do interního fungování těchto aplikací? Chci říct, existuje nějaký způsob, jak se skutečně podívat na příkazy, které se provádějí při každém kliknutí na tlačítko?
- Otevírají tyto aplikace terminál na pozadí a provádějí tyto příkazy?
Odpověď zde říká, jak získat standardní deskriptor souboru procesu. Ale ve výstupu jsem nic nedostal.
Navíc strace -p pid -o output.txt
příkaz hodí do souboru obrovské množství textu.
Takže, stručně řečeno, je dělat věci pomocí GUI aplikací stejné jako dělat věci z příkazového řádku?
Přijatá odpověď:
Provádějí tyto aplikace založené na GUI také stejný příkaz na pozadí?
Ano i ne. Zapisují do dconf
databáze nastavení, ale mohou k tomu používat různé způsoby. Programy napsané v Pythonu budou pravděpodobně používat gi.repository.Gio
modul (vím, protože ho často používám) nebo mohou místo toho použít gsettings
jako externí příkaz voláním subprocess.Popen(['gsettings','org.some.schema','some-key','value'])
a bude v podstatě běžet jako příkaz shellu. C program bude používat něco podobného, pravděpodobně gio.h
knihovna nebo může dokonce používat exec()
rodina funkcí dělat to samé jako Popen
dělá v pythonu. Abychom odpověděli na vaši titulní otázku:„Provádějí aplikace založené na GUI příkazy shellu na pozadí? Mohou, ale pravděpodobně to není nutné, protože existuje knihovna pro jakýkoli jazyk, ve kterém je aplikace napsána, a pravděpodobně bude o něco rychlejší použít funkci knihovny než vytvořit nový proces.
Chcete-li vám poskytnout ukázku toho, jak se to dělá s knihovnami/moduly, neváhejte se podívat na zdrojový kód mého indikátoru seznamu spouštěčů. Tam jsem napsal funkci pro vytvoření instance Gio.Settings
class a poté jej použijte k úpravě spouštěče Unity v závislosti na typu seznamu, který tam chcete mít.
Jak nahlédnout do vnitřního fungování těchto aplikací? Chci říct, existuje nějaký způsob, jak se skutečně podívat na příkazy, které se provádějí při každém kliknutí na tlačítko?
Ne. Pokud chcete vidět, který příkaz je vydán v programovacím jazyce dané aplikace, když stisknete tlačítko nebo kliknete na prvky okna, pak to není možné. Přečtěte si zdrojový kód aplikace, pokud je možné jej získat. Můžete použít dconf watch /
abyste viděli, jaká nastavení se mění, ale ne jak se to dělá.
Technicky vzato, pokud víte, jak pracovat s debuggerem, číst adresy paměti a znáte nějaký jazyk symbolických instrukcí, můžete vědět, co aplikace dělá na úrovni CPU a paměti. Toto je známé jako softwarové reverzní inženýrství a je často používáno bezpečnostními profesionály k analýze škodlivého softwaru a odhalování zranitelností v legitimním softwaru.
Otevírají tyto aplikace terminál na pozadí a provádějí tyto příkazy?
Ne, není připojen žádný terminál. Mnoho programů ví, kde je dconf
se nachází databáze pro uživatele a zapište se tam. Existuje také meziprocesová komunikační sběrnice známá jako dbus
, kde programy mohou vysílat signály a program bude vypadat jako „Hej, to je zpráva pro mě!“
Dodatek
-
Mohou aplikace spouštět jiné aplikace? Ano, to se provádí pomocí standardního
fork()
aexecve()
systémová volání. Podstata vytváření procesů na Linuxu a dalších *nix systémech je z velké části založena na těchto dvou. Shell mechanismus pro spouštění nezabudovaných příkazů toho hodně využívá. Když spustíte interaktivně$ ls
shell vytvoří nový proces pomocí
fork()
, tento proces spustíexecve()
který spustíls
. Kvůli tomu, jakexecve()
tento nový rozvětvený proces budels
.pipe()
systémové volání pomůže přečíst zpět výstupls
. Důrazně doporučuji přečíst si svou odpověď na otázku Jaký je rozdíl mezi potrubím a přesměrováním, abyste pochopili, jak funguje mechanismus potrubí – není to jen|
operátor, ale ve skutečnosti systémové volání. -
Mohou aplikace spouštět příkazy shellu? Ne. Syntaxi shellu rozumí pouze samotný shell. Co však můžete udělat, je spustit shell pomocí příkazového řádku
-c
přepnout a poskytnout příslušné příkazy. To se často používá pro vlastní zkratky nastavené v GNOME nebo jiných desktopových prostředích, protože vlastní zkratky fungují se spustitelnými soubory a neexistuje žádný shell, který by porozuměl syntaxi. Jako příklad byste tedy udělalibash -c 'xdotool key Ctrl+Alt+T'
nepřímo spustitxdotool
příkaz nebobash -c 'cd $HOME/Desktop; touch New_File'
pro vytvoření nového souboru na ploše pomocí zástupce. Toto je obzvláště zajímavý příklad, protože můžete použít proměnnou shellu, protože používáte shell explicitně.