Proč používáme ./filename ke spuštění souboru v linuxu?

Proč ne stačí jej zadat jako ostatní příkazy gcc, ls atd …

Komentáře

  • Nebyl by ‚ první řádek lépe napsán jako “ Proč používáme ./command_name k provedení příkazu v linuxu? “
  • user15760, Ne, protože máme rádi otázky zjistitelní ve vyhledávačích a ne všichni, kteří mají tuto otázku, jsou přirozeně zrozeni ‚ nixsters (:

odpověď

V systému Linux, UNIX a souvisejících operačních systémech . označuje aktuální adresář. Protože chcete spustit soubor v aktuálním adresáři a v tomto adresáři není ve vašem $PATH, potřebujete ./ bit, abyste řekli shellu, kde spustitelný soubor je. ./foo tedy znamená spustit spustitelný soubor s názvem foo, který je v tomto adresáři.

Můžete použít type nebo which Chcete-li získat úplnou cestu ke všem příkazům nalezeným ve vašich $PATH.

Komentáře

  • Je velmi běžné spouštět programy v aktuálním adresáři. Proč i tam ‚ nehledá shell? Nejprve vyhledá v., Poté v $ PATH.
  • existují také alias es, které vám mohou překážet, nejen $PATH.
  • @Michael bezpečnost a zdravý rozum: Pokud by to hledalo v ., pak by se jednalo o bezpečnostní problém, vy nebo někdo jiný by jej mohl Například ls (jednoduchý virus / trojen: vytvořte soubor zip se spustitelným souborem s názvem ls, jak to někdo prohledává, provozují tento spustitelný soubor, že …). Pokud to prohledávalo . naposledy, můžete se dlouho bláznit a nevědět, proč váš program nefunguje (např. Vytvoříte program s názvem test, místo aby běžel váš program běží systémový testovací program. Který neprodukuje žádný výstup).
  • @jcubic to je ‚ špatný nápad. Viz komentář výše. V minulosti DOS hledal v aktuálním adresáři a toto chování bylo provedeno na Windows cmd, což přináší mnoho bezpečnostních problémů. MS to opravilo v PowerShellu a nyní musíte použít. \ Ke spuštění programu v aktuálním adresáři
  • @ ctrl-alt-delor: Když jsem byl na univerzitě koncem 80 ‚ s, toto byla běžná (zakázaná) taktika. Psaní programu “ ls “ a jeho ponechání ve vaší domovské složce pro případ, že by někdo jiný slídil. Program byl nazván “ get shell “ IIRC. Pokusilo by se získat pověření uživatele, který spustil příkaz – a pak by mohl vytisknout falešný seznam adresářů, aby je nevěděl.

Odpovědět

Doslovná odpověď je stejná jako ostatní: protože aktuální adresář ve vašem $PATH.

Ale proč? Stručně řečeno, je to kvůli bezpečnosti. Pokud hledáte domovský adresář někoho jiného (nebo / tmp) a zadáte pouze gcc nebo ls, chcete víte, že používáte skutečnou verzi, nikoli škodlivou verzi, kterou napsal váš vtipálek a která smaže všechny vaše soubory. Dalším příkladem může být test nebo [, který může tyto příkazy přepsat ve skriptech prostředí, pokud váš shell tyto nemá jako vestavěné prvky.

S . jako poslední vstup na vaší cestě je o něco bezpečnější, ale existují i jiné útoky, které to využívají. Snadné je využít běžné překlepy, například sl nebo ls-l. Nebo najděte běžný příkaz, který v tomto systému není nainstalován – například vim, protože u sysadminů je nadprůměrná pravděpodobnost, že jej napíšete.

Zní to příliš teoreticky? Je to převážně , ale rozhodně se to může stát ve skutečnosti, zejména v systémech pro více uživatelů. ve skutečnosti je příklad z tohoto webu , kde správce přepnul na domovský adresář uživatelů a našel ps být maskován spustitelným souborem s tímto názvem.

Komentáře

  • Stačí mít absolutní cesty v PATH proměnná prostředí.

Odpověď

Pokud máte na mysli, proč potřebujete./ na začátku – to proto, že (na rozdíl od Windows) není aktuální adresář ve výchozím nastavení součástí vaší cesty. Pokud spustíte:

$ ls 

váš shell hledá ls v adresářích v proměnné prostředí PATH (echo $PATH) a spustí první spustitelný soubor s názvem ls, který najde. Pokud napíšete:

$ a.out 

shell bude fungovat stejně – ale pravděpodobně nenajde spustitelný soubor s názvem a.out. Musíte shellu říct, kde a.out je – je to v aktuálním adresáři (.), pak je cesta ./a.out.

Pokud se ptáte, proč se volá „a.out“, to je jen výchozí název výstupního souboru pro gcc. Můžete jej změnit pomocí příkazového řádku -o arg. Například:

$ gcc test.c -o test $ ./test 

Komentáře

  • Děkuji. Moje pochybnost je, proč potřebujete ./ na začátku …. Používám „.“ (k umístění aktuálního adresáře), ale proč “ / “ poté?
  • / je v Linuxu oddělovač cesty, takže jej použijete k oddělení adresáře (.) od názvu souboru (a.out). Bez něj máte .a.out, což je platný název souboru sám o sobě. (Zkuste to zobrazit touch .a.out; ls -lA.)
  • tak určíte cesta v Unixu, <dir>/<file>, takže v podstatě říkáte, že spustíte soubor v aktuálním adresáři, což je označeno ./test
  • Red Hat Linux 9? Čas na upgrade!
  • V systému Windows 10 je nyní výchozím prostředím PowerShell a také vyžaduje ./ spuštění spustitelného souboru v aktuální cestě

Odpověď

Můžete se pokusit přidat :. do vaší proměnné $ PATH.

Zkuste ALT + F2 a zadejte: gksudo gedit /etc/environment, pokud používáte Linux / GTK (to je to, co máte, pokud používáte Ubuntu).

HOWEVER, Důrazně vám doporučuji, abyste to nedělali. Je to špatné, špatné, špatné.

Víte, takové věci fungují takto od roku 1970. Existuje důvod, proč aktuální adresář není zahrnut do $ PATH.

. je aktuální adresář

.something by byl skrytý soubor (zadejte „ALT +“ objeví se v Nautilu, nebo zkuste použít „ls -la„.

./someProgram.sh spustíte spustitelný program .sh v aktuálním adresáři.

.somethingElse by znamenalo, že máte v aktuálním adresáři skrytý spustitelný soubor, což je špatný nápad.

Odpověď

Ve skutečnosti je úplnější pravidlo: pokud existuje lomítko / je v cestě, nehledejte PATH

Než se pustíme do z důvodu, měli byste nejprve vědět o této skutečnosti: spuštění některého z:

bin/someprog 

nebo:

nebo:

cd bin ./myexec 

spustit bin/someprog bez prohledání PATH proměnná ze stejného důvodu: všechny bin/someprog, /bin/someprog a ./someprog mít v sobě lomítko /.

someprog sám lomítko nemá div id = „37444659d1“>

, a proto vyhledává pouze vPATH.

POSIX 7 určuje toto pravidlo na adrese: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_01_01

PATH

[…] Pokud hledaný název cesty obsahuje <slash>, hledání přes předpony cesty se neprovádí .

Odůvodnění pravidla / POSIX PATH

Předpokládejme, že běží:

someprog 

vyhledá:

  • nejdříve relativní k CWD
  • relativně k PATH po

Pak, pokud byste chtěli spustit /bin/someprog z vaší distribuce a udělali jste to:

someprog 

to by někdy fungovalo, ale jiné by selhalo, protože možná se nacházíte v adresáři, který obsahuje jiný nesouvisející program someprog.

Proto byste se brzy dozvěděli, že to není spolehlivé, a nakonec byste vždy používali absolutní cesty, pokud chcete použít PATH, a proto porazit účel PATH.

To je také důvod, proč mít relativní cesty ve vaší PATH je opravdu špatný nápad. se na vás dívám, node_modules/bin .

Naopak předpokládejme, že spuštěno:

./someprog 

Bylo by vyhledáno:

  • relativní k PATH jako první
  • relativně k CWD po

Pak, pokud jste si stáhli skript someprog z úložiště git a chtěli jej spustit z CWD, nikdy byste si nebyli jisti, že toto je skutečný program, který by běžel, protože možná vaše distro má:

/bin/someprog 

, který je ve vás PATH od nějaký balíček, který jste nainstalovali po příliš velkém vypití po Vánocích loňského roku.

Proto byste byli opět nuceni vždy spouštět místní skripty relativní k CWD s úplnými cestami, abyste věděli, co používáte:

"$(pwd)/someprog" 

což by také bylo velmi nepříjemné.

Další pravidlo, na které byste mohli být v pokušení přijít, by bylo:

relativní cesty používají pouze PATH, absolutní cesty pouze CWD

, ale opět to nutí uživatele vždy používejte abso cesty loutny pro skripty jiné než PATH s "$(pwd)/someprog".

Pravidlo hledání cesty / nabízí snadno zapamatovatelné řešení k problému about:

  • slash: nepoužívejte PATH
  • žádné lomítko: používejte pouze PATH

díky kterému je super snadné vždy vědět, co právě používáte, protože se spoléhá na skutečnost, že soubory v aktuálním adresáři lze vyjádřit buď jako ./somefile nebo somefile, takže jednomu z nich dává zvláštní význam.

Někdy je trochu nepříjemné, že nemůžete vyhledávat pro some/prog ve vztahu k PATH, ale nevidím pro to rozumnější řešení.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *