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
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í.
alias
es, které vám mohou překážet, nejen$PATH
..
, pak by se jednalo o bezpečnostní problém, vy nebo někdo jiný by jej mohl Napříkladls
(jednoduchý virus / trojen: vytvořte soubor zip se spustitelným souborem s názvemls
, 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).