GNU/Linux >> Linux Esercitazione >  >> Linux

In che modo Linux gestisce più separatori di percorsi consecutivi (/home////nomeutente///file)?

Sto lavorando su uno script Python che passa le posizioni dei file a un sottoprocesso scp. Va tutto bene, ma mi trovo in una situazione in cui potrei finire per concatenare un percorso con un nome file tale che ci sia un doppio '/ nel percorso. So che a bash non importa se hai più separatori di file, ma mi chiedo come viene corretto esattamente. È bash che rimuove extra / s o davvero non importa mai?

Lo chiedo perché mi salveranno diverse righe di codice per verificare la presenza di / extra s durante la concatenazione. So che non è un grosso problema, ma sono anche curioso. Ho uno script bash che ha la riga cd //usr (invece di cd /usr ), il che sembra implicare che potrebbe essere importante utilizzare più / s in un percorso

Risposta accettata:

Sono consentite più barre che equivalgono a una singola barra. Dalla specifica Single Unix (versione 4), definizioni di base §3.271 percorso:"Più barre successive sono considerate uguali a una barra".

C'è un'eccezione:se un percorso inizia con due caratteri slash successivi, il primo componente che segue i caratteri slash iniziali può essere interpretato in un modo definito dall'implementazione. (rif:definizioni di base §4.13 risoluzione del percorso). Linux stesso non lo fa, anche se alcune applicazioni potrebbero farlo e altri sistemi unix-ish (ad esempio Cygwin).

Un / finale alla fine di un nome di percorso forza il nome di percorso a fare riferimento a una directory. In (POSIX 1003.1-2001 (Single Unix v4) definizioni di base §4.11 risoluzione del percorso, un / finale è equivalente a un /. finale . Definizioni di base POSIX 1003.1-2008 (Single Unix v4) §4.13 rimuove il requisito per renderlo equivalente a /. , per far fronte a directory inesistenti (ad es. mkdir foo/ è necessario per funzionare, mentre mkdir foo/. non lo farebbe — vedi la motivazione del cambiamento).

Per i programmi che agiscono su una voce di directory, se foo è un collegamento simbolico a una directory, quindi passa foo/ è un modo per far agire il programma sulla directory invece del collegamento simbolico.

¹ Si noti che questo vale solo per la risoluzione del percorso, cioè quando si accede ai file. Le manipolazioni dei nomi dei file possono funzionare in modo diverso. Ad esempio basename e dirname ignora le barre finali.


Linux
  1. Linux:differenza tra /dev/console , /dev/tty e /dev/tty0?

  2. Installa i binari in /bin, /sbin, /usr/bin e /usr/sbin, interazioni con --prefix e DESTDIR

  3. Quando dovrei usare /dev/shm/ e quando dovrei usare /tmp/?

  4. Linux:differenza tra /dev/console , /dev/tty e /dev/tty0

  5. I siti web dovrebbero vivere in /var/ o /usr/ in base all'utilizzo consigliato?

Linux – Unire /usr/bin e /usr/sbin in /bin (gnu/linux)?

Kubuntu mostra un errore all'accesso (file:///usr/share/sddm//themes/breeze/main.qml:no Such File Or Directory)?

Ubuntu 14.04 "non ha ricevuto un file Uri di riproduzione in entrata::///*"?

"impossibile creare la directory della cache /home//.composer/cache/repo/https—packagist.org/, oppure la directory non è scrivibile. Procedere senza cache”?

Comprendere i file /proc/mounts, /etc/mtab e /proc/partitions

Come modificare /tmp predefinito in /home/user/tmp