C'è qualche differenza tra i percorsi "file" e "./file"?


Risposte:


14

Non vado matto per la spiegazione di SmallLoanOf1M. È tecnicamente corretto ma risponde in un modo che non corrisponde all'esempio d'uso nella domanda.

Quindi, a titolo di esempio, ecco una differenza importante tra i due dalla domanda: "file" e "./file"

Cosa succede se il file viene nominato con un carattere analizzato dalla shell? Soprattutto per quanto riguarda i personaggi interpretati dal comando uno è in esecuzione.

In particolare, il carattere "trattino": "-". Ma altri personaggi sono significativi per la shell.

Esempio. Il mio file è stato chiamato "-dingle"

Prova a elencare il file:

ls -dingle
# ls -dingle
ls: invalid option -- 'e'

Ancora peggio, e se il file fosse chiamato " -rf rmbomb *"? Ora prova a rimuoverlo

rm "-rf rmbomb *"

Non proverò nemmeno a dare l'esempio, ma spero che tu abbia l'idea.

Quindi, come si fa a elencare un file con il trattino? Utilizzare ./davanti.

# ls ./-dingle
./-dingle

Idem per rm


Questo è un modo valido per elaborare alcuni file con nomi dispari e la mia risposta non ha preso in considerazione file del genere. Si potrebbe anche usare un valore letterale invece in tutti gli esempi sopra, sotto forma di una barra rovesciata che precede i caratteri dispari, inclusi gli spazi sopra specificati. Un esempio sarebbe così: ls \-dingleo ls \-rf\ rmbomb\ \*. Questo può essere un buon modo per garantire che qualsiasi dato set di comandi sia almeno coerente, poiché specificare ./prima di un nome non sfuggirà ai caratteri dopo il ./.
Spooler,

2
Succede che, dal momento che la shell sfugge agli escape, non al comando e ai parametri che vengono analizzati dal comando, l'escape o la citazione di - non fa nulla di utile.
Dewi Morgan,

2
Sembra che rm "-rf rmbomb *"farebbe davvero qualcosa di brutto, invece di fare semplicemente rmun errore di stampa. È pericoloso solo se ti dimentichi di citare il nome del file, quindi si verifica la divisione delle parole. (specialmente in uno script di shell in cui esegui rm $fileinvece di rm "$file". Ma in quel caso, *non si espanderà, perché l'espansione glob non si verifica sul contenuto dell'espansione variabile. Se lo desideri, avresti bisogno di un eval.) Comunque, se la tua sceneggiatura divide i nomi dei file prima di passare a rm, creerei un file chiamato space -rf .o qualcosa del genere, quindi rm ./$inon aiuta.
Peter Cordes,

1
A proposito, il vero messaggio di errore è rm: invalid option -- ' ', da quando tenta di interpretare lo spazio -rfcome un interruttore a singolo carattere, perché fa parte dello stesso argomento. (E sì, l'ho eseguito all'interno di una directory vuota nel caso in cui avessi trascurato qualcosa ed era effettivamente pericoloso: P)
Peter Cordes,

2
@PeterCordes: il wordplitting e il globbing si verificano sui risultati dell'espansione delle variabili non quotate e della sostituzione dei comandi, a meno che non siano soppressi da IFS=''e -frispettivamente. Un esempio più raro è che awktratta un operando (diverso da un primo operando che è lo script) che ha forma foo=barcome compito da eseguire ma ./foo=barcome file da leggere.
dave_thompson_085,

7

Sì.

Emettendo filedalla riga di comando, BASH cercherà nella propria variabile d'ambiente $ PATH un file con quel nome. A meno che il file non risieda in una directory all'interno della variabile $ PATH, non verrà trovato.

.indica la directory corrente. ./significa all'interno della directory corrente, in termini relativi. È l'equivalente di dire qualcosa come /home/sheogorath/shivering/isles.imgquando si invoca ./isles.imgmentre si lavora nella /home/sheogorath/shivering/directory.

Come tale, viene comunemente utilizzato per eseguire i file all'interno della directory di lavoro "sul posto".

EDIT: Nel tuo esempio, lsviene chiamato dalla shell e trovato usando la variabile path. Il suo argomento verrà elaborato nella directory di lavoro, qualunque essa sia. Poiché questo è il valore predefinito per ls, non vedrai alcuna differenza tra specificare filee specificare esplicitamente ./filepoiché entrambi puntano alla tua directory corrente.

Non tutti i comandi accetteranno i percorsi dei file nella directory di lavoro e alcuni si aspettano di avere i file in una directory che essi stessi predefiniscono tramite la configurazione. Tra i comandi che accettano file come argomenti, questi comandi sono meno comuni


1
Questo è bash, ma mi chiedevo quale fosse la risoluzione del percorso in generale
Sergey Alaev,

1
Questo è il modo in cui qualsiasi shell abbia mai sentito parlare di opere. BASH è semplicemente il più comunemente usato.
Spooler,

4
$ PATH è rilevante solo per i comandi e non ha nulla a che fare con gli argomenti del nome file che seguono un comando come lsmenzionato nella domanda originale. Questa è più la differenza tra riferire un percorso relativo (rispetto alla directory di lavoro corrente) ../../dir/filename /path/to/dir/filename
Vale a

1
+1 per Sheogorath ... e una risposta corretta.
Corey Ogburn,

1
Se sono argomenti per un comando che tenta di trovare i file nella directory di lavoro per impostazione predefinita, saranno gli stessi. Pertanto, lspoiché saranno sempre lo stesso percorso, uno specificato in modo più esplicito rispetto all'altro. Non tutti i comandi si comportano in questo modo durante l'elaborazione degli argomenti, ma molti lo fanno.
Spooler,
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.