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

  • Este foarte frecvent să executați programe în directorul curent. De ce ‘ nu caută și shell-ul acolo? Mai întâi caută în., Apoi în $ PATH.
  • există, de asemenea, alias e care pot intra în cale, nu doar $PATH.
  • @Michael securitate și sănătate: dacă a căutat mai întâi în ., atunci ar fi o problemă de securitate, pe care tu sau altcineva l-ai putea înlocui ls de exemplu (un simplu virus / troian: creați un fișier zip cu un executabil numit ls, 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).
  • @jcubic că ‘ este o idee proastă. Vezi comentariul de mai sus. În trecut, căutările DOS în directorul curent și acel comportament a fost purtat pe Windows cmd, ceea ce introduce multe probleme de securitate. MS a remediat acest lucru în PowerShell și acum trebuie să utilizați. \ Pentru a rula programul în directorul curent
  • @ ctrl-alt-delor: Când eram la universitate la sfârșitul anilor 80 ‘ s, aceasta era o tactică obișnuită (interzisă). Scrierea unui program ” ls ” și lăsarea acestuia în folderul de acasă, în cazul în care altcineva a venit să spioneze. Programul a fost numit ” get shell ” IIRC. Ar încerca să obțină acreditările utilizatorului care execută comanda – și apoi poate să tipărească o listă de directoare falsă pentru a-i lăsa neștiincioși.

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.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *