GNU/Linux >> Znalost Linux >  >> Linux

Jak Linux zpracovává více po sobě jdoucích oddělovačů cest (/home////username///soubor)?

Pracuji na skriptu python, který předává umístění souborů podprocesu scp. To je všechno v pořádku, ale jsem v situaci, kdy se mi může stát, že cestu zřetězím s názvem souboru tak, že tam bude dvojité „/ v cestě. Vím, že bash se nestará, pokud máte více oddělovačů souborů, ale zajímalo by mě, jak přesně je to opraveno. Je to bash, který odstraňuje extra / s nebo na tom opravdu nikdy nezáleží?

Ptám se, protože mi to ušetří několik řádků kódu, abych zkontroloval další / s při zřetězení. Vím, že to není nic moc, ale taky mě to zajímá. Mám bash skript, který má řádek cd //usr (místo cd /usr ), což zřejmě naznačuje, že použití více / může mít význam s v cestě

Přijatá odpověď:

Více lomítek je povoleno a jsou ekvivalentní jednomu lomítku. Ze specifikace Single Unix (verze 4), základní definice §3.271 cesta:“Více po sobě jdoucích lomítek je považováno za stejné jako jedno lomítko.”

Existuje jedna výjimka:Pokud cesta začíná dvěma po sobě jdoucími znaky lomítka, první komponenta následující za znaky úvodního lomítka může být interpretována způsobem definovaným implementací. (viz:základní definice §4.13 rozlišení názvu cesty). Samotný Linux to nedělá, i když některé aplikace ano a jiné unixové systémy ano (např. Cygwin).

Koncové / na konci názvu cesty vynutí, aby název odkazoval na adresář. V základních definicích (POSIX 1003.1-2001 (Single Unix v4) §4.11 rozlišení názvu cesty je koncový / je ekvivalentní koncovému /. . Základní definice POSIX 1003.1-2008 (Single Unix v4) § 4.13 odstraňuje požadavek, aby byl ekvivalentní /. , abyste si poradili s neexistujícími adresáři (např. mkdir foo/ je vyžadováno, aby fungovalo, zatímco mkdir foo/. ne – viz zdůvodnění změny).

Pro programy, které jednají se záznamem v adresáři, pokud foo je symbolický odkaz na adresář, který předává foo/ je způsob, jak přimět program jednat podle adresáře namísto symbolického odkazu.

¹ Upozorňujeme, že to platí pouze pro rozlišení názvu cesty, tj. při přístupu k souborům. Manipulace s názvy souborů mohou fungovat odlišně. Například basename a dirname ignorovat koncová lomítka.


Linux
  1. Bash =~ Regex A Https://regex101.com/?

  2. Debian – Přesunutí /var, /home do samostatného oddílu?

  3. Kubuntu zobrazuje chybu při přihlášení (file:///usr/share/sddm//themes/breeze/main.qml:žádný takový soubor nebo adresář)?

  1. Ubuntu 14.04 „nedošlo k přehrávání Uri na vstupním souboru:///*“?

  2. „Nelze vytvořit adresář mezipaměti /home//.composer/cache/repo/https—packagist.org/, nebo adresář není zapisovatelný. Pokračovat bez mezipaměti“?

  3. Jak zjistit, ze které složky běží proces?

  1. unix:///var/run/supervisor.sock žádný takový soubor

  2. Linux:Rozdíl mezi /dev/console , /dev/tty a /dev/tty0

  3. echo nebo print /dev/stdin /dev/stdout /dev/stderr