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.