Perché devo digitare "./" sempre prima di un eseguibile per eseguirlo in Linux?


8

Quando compilo egxc per:

GCC x.c -o x

Per eseguire il risultato devo scrivere:

./x

E solo digitando:

x

Non riesce con questo messaggio:

x: comando non trovato

Questo significa che Linux non cerca la directory corrente per questo! C'è (sono sicuro che ci sia) qualche problema ragionevole dietro questo comportamento?


Perché sono le regole.
Daniel R Hicks,

@DanH: Quindi spiegare "le regole" per favore.
Torben Gundtofte-Bruun,

Risposte:


13

Perché per impostazione predefinita, la directory di lavoro corrente non si trova nella PATHvariabile.

Questa è una misura di sicurezza / convenienza. Se hai binari / script chiamati eg cd, lsecc. Nella tua attuale directory di lavoro, sarebbe molto fastidioso se fossero eseguiti di default.


4
La risposta è solo parzialmente corretta. Il problema potrebbe essere circondato se la directory corrente fosse utilizzata solo come ultima opzione. Quindi gli strumenti standard verranno comunque trovati per primi.
utente sconosciuto

1
Inoltre, comandi incorporati della shell hanno la precedenza (vale a dire quando si digita cdin bash, si esegue una routine per interno bash e non /bin/cd) a meno che non anteporre `.`
LawrenceC

3
Una delle misure di sicurezza * nix originali, forza l'esecuzione di binari compilati dal sistema o dall'amministratore nel comando path assegnato al sistema. Niente di male come qualcuno che accede come root su una domanda dell'help desk, vai in una directory utente, digita ls e scopri che ha caricato una bomba lasciata da un utente.
Fiasco Labs,

7
@userunknown: E la prima volta che hai digitato sl, hai lo stesso problema. Dovrebbero trovarsi solo directory attendibili $PATHe percorsi relativi come non. sono mai una directory attendibile per una shell interattiva.

2
@Basic: se scrivo rm -r targetquando volevo dire, di rm -f targetsolito non c'è differenza. Se scrivo rm -f targetquando volevo dire rm -r target, o non c'è alcuna differenza o la rimozione fallisce. Inoltre, credo che ogni volta prima di tipo I rm, soprattutto se sto aggiungendo -fo -ro un glob - è un comando pericoloso per sua natura. Nessuno ci pensa prima di lsing.

1

Significa che la directory corrente non è nella variabile $ PATH.


1

È possibile risolvere questo problema aggiungendo la directory corrente (rappresentata da un singolo punto) alla PATHvariabile di ambiente.
Il modo per farlo dipende dalla shell che stai usando.
se stai usando bash, puoi aggiungere la linea export PATH=$PATH:.al .bashrcfile nella tua home directory.
se stai usando csh o tcsh aggiungi la linea set PATH = ($PATH .)al file .cshrc nella tua home directory.
IMHO, per un computer desktop domestico questa è una cosa accettabile da fare - per quanto riguarda la sicurezza.


Non sapevo che possiamo aggiungere. PERCORSO, tuttavia, ciò riduce la sicurezza, giusto?
Yasser Zamani,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.