De ce folosim ./filename
pentru a executa un fișier în linux?
De ce nu doar introduceți-l ca și alte comenzi gcc
, ls
etc …
Comentarii
- Nu ‘ prima linie nu ar fi mai bine scrisă ca ” De ce folosim
./command_name
pentru a executa o comandă în linux? ” - user15760, nu, pentru că ne plac întrebările pot fi descoperite în motoarele de căutare și nu toți cei care au această întrebare sunt nativi naturali ‘ nixsters (:
Răspuns
În Linux, UNIX și sistemele de operare conexe, .
denotă directorul curent. Deoarece doriți să rulați un fișier în directorul curent și în directorul respectiv nu se află în $PATH
, aveți nevoie de bitul ./
pentru a spune shell-ului unde executabilul este. Deci, ./foo
înseamnă rulați executabilul numit foo
care se află în acest director.
Puteți utiliza type
sau which
pentru a obține calea completă a oricăror comenzi găsite în $PATH
.
Comentarii
Răspuns
Răspunsul literal este așa cum au dat alții: deoarece directorul curent nu este „t în $PATH
.
Dar de ce? Pe scurt, este pentru siguranță. Dacă „căutați în directorul de origine al altcuiva (sau / tmp) și tastați doar gcc
sau ls
, doriți să știți că o executați pe cea reală, nu o versiune rău intenționată pe care a scris-o prietenul dvs. farsă, care vă șterge toate fișierele. Un alt exemplu ar fi test
sau [
, care ar putea suprascrie acele comenzi în scripturile shell, dacă shell-ul dvs. nu le are ca elemente încorporate.
Având .
ca ultima intrare în calea ta este puțin mai sigură, dar există și alte atacuri care folosesc asta. Un lucru ușor este să exploatezi greșeli de scriere obișnuite, cum ar fi sl
sau ls-l
. Sau găsiți o comandă obișnuită care nu este instalată pe acest sistem – vim
, de exemplu, deoarece sysadmins au o probabilitate peste medie de a tasta acest lucru.
Sună prea teoretic? În mare măsură este, dar cu siguranță se poate întâmpla în realitate, în special pe sistemele cu mai mulți utilizatori. De fapt, iată un exemplu de pe acest site în care un administrator a trecut la directorul de acasă al unui utilizator și a găsit ps
să fie mascat de un executabil cu acel nume.
Comentarii
- Doar aveți căi absolute în
PATH
variabilă de mediu.
Răspuns
Dacă vrei să spui, de ce ai nevoie./ la început – asta pentru că (spre deosebire de Windows), directorul curent nu face parte implicit din calea ta. Dacă rulați:
$ ls
shell-ul dvs. caută ls
în directoarele din variabila de mediu PATH (echo $PATH
pentru ao vedea) și rulează primul executabil numit ls
pe care îl găsește. Dacă tastați:
$ a.out
shell-ul va face la fel – dar probabil că nu va găsi un executabil numit a.out. Trebuie să spuneți shell-ului unde a.out este – se află în directorul curent (.) atunci calea este ./a.out
.
Dacă „întrebați de ce este apelat „a.out”, acesta este doar numele implicit al fișierului de ieșire pentru gcc. Puteți să-l modificați cu argumentul liniei de comandă -o. De exemplu:
$ gcc test.c -o test $ ./test
Comentarii
- Mulțumesc. Îndoiala mea este de ce aveți nevoie. / la început …. am folosit „.” (pentru a selecta directorul curent), dar de ce ” / ” după aceea?
- / este separatorul de căi în Linux, deci îl folosiți pentru a separa directorul (.) de numele fișierului (a.out). Fără acesta aveți .a.out care este valid nume de fișier în sine. (Încercați
touch .a.out; ls -lA
pentru a vedea acest lucru.) - așa specificați cale în Unix,
<dir>/<file>
deci, practic, spuneți că executați un fișier în directorul curent, care este indicat de./test
- Red Hat Linux 9? E timpul să faceți upgrade!
- În Windows 10 PowerShell este shell-ul implicit acum și necesită, de asemenea,
./
pentru a rula un executabil în calea curentă
Răspuns
Puteți încerca să adăugați :.
la variabila dvs. $ PATH.
Încercați ALT + F2 și tastați: gksudo gedit /etc/environment
dacă rulați Linux / GTK (aceasta este ceea ce aveți dacă utilizați Ubuntu).
Oricum, Vă sfătuiesc cu tărie să nu faceți asta. Este rău rău rău și rău.
Știi, genul acesta de lucruri funcționează așa din 1970. Există un motiv pentru care directorul actual nu este inclus în $ PATH.
.
este directorul curent
.something
ar fi un fișier ascuns (Tastați „ALT +” pentru a face acestea apar în Nautilus sau încercați „ls -la
„.
./someProgram.sh
este ceea ce tastați pentru a RUNA un program executabil .sh în directorul curent.
.somethingElse
ar însemna că aveți un executabil ascuns în directorul curent, ceea ce este o idee proastă.
Răspuns
Regula mai completă este de fapt: dacă există o bară /
este pe cale, nu căutați PATH
Înainte de a intra în rațiunea, ar trebui să știți mai întâi despre acest fapt: rularea oricăruia dintre:
bin/someprog
sau:
sau:
cd bin ./myexec
executați bin/someprog
fără a căuta PATH
variabilă din același motiv exact: toate bin/someprog
, /bin/someprog
și ./someprog
au o bară /
în ele.
someprog
singur nu are o bară /
și, prin urmare, caută numai în PATH
.
POSIX 7 specifică această regulă la: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_01_01
PATH
[…] Dacă calea căutată conține un
<slash>
, căutarea prin prefixele căii nu va fi efectuată .
Motivarea regulii /
POSIX PATH
Să presupunem că rulează:
someprog
ar căuta:
- relativ la CWD mai întâi
- relativ la PATH după
Apoi, dacă ați dori să rulați /bin/someprog
din distribuția dvs. și ați făcut:
someprog
uneori ar funcționa, dar altele ar eșua, deoarece s-ar putea să vă aflați într-un director care conține un alt program someprog
fără legătură.
Prin urmare, veți afla în curând că acest lucru nu este fiabil și veți ajunge să utilizați întotdeauna căi absolute atunci când doriți să utilizați PATH, prin urmare învingând scopul PATH.
Acesta este și motivul pentru care să aveți căi relative în PATH este o idee foarte proastă. „M mă uit la tine, node_modules/bin
.
Dimpotrivă, să presupunem că rularea:
./someprog
Ar căuta:
- în raport cu PATH mai întâi
- relativ la CWD după
Apoi, dacă tocmai ați descărcat un script someprog
dintr-un depozit git și ați dorit să îl rulați din CWD, nu ați fi sigur niciodată că acesta este programul real care ar rula, deoarece poate distribuția dvs. are un:
/bin/someprog
care se află în PATH de la un pachet pe care l-ați instalat după ce ați băut prea mult după Crăciunul de anul trecut.
Prin urmare, din nou, ați fi forțat să rulați întotdeauna scripturi locale în raport cu CWD cu căi complete pentru a ști ce rulați:
"$(pwd)/someprog"
ceea ce ar fi extrem de enervant.
O altă regulă cu care ați putea fi tentat să veniți ar fi:
căile relative folosesc doar PATH, căile absolute doar CWD
dar încă o dată acest lucru îi obligă pe utilizatori să folosiți întotdeauna abso căi de lute pentru scripturi non-PATH cu "$(pwd)/someprog"
.
Regula de căutare a căilor /
oferă o soluție simplă de reținut la problema despre:
- slash: don „t use
PATH
- no slash: use only
PATH
ceea ce face foarte ușor să știi întotdeauna ce rulezi, bazându-te pe faptul că fișierele din directorul curent pot fi exprimate fie ca ./somefile
sau somefile
și, prin urmare, dă un sens special uneia dintre ele.
Uneori, este ușor enervant că nu puteți căuta pentru some/prog
relativ la PATH
, dar nu văd o soluție mai sănătoasă la acest lucru.
alias
e care pot intra în cale, nu doar$PATH
..
, atunci ar fi o problemă de securitate, pe care tu sau altcineva l-ai putea înlocuils
de exemplu (un simplu virus / troian: creați un fișier zip cu un executabil numitls
, pe măsură ce cineva caută, ei execută acest executabil, că …). Dacă s-a căutat în.
ultima, puteți petrece mult timp înnebunind fără să știți de ce programul dvs. nu funcționează (de exemplu, faceți un program numit test, în loc să rulați programul rulează programul de testare a sistemelor. Care nu produce nicio ieșire).