it-swarm-pt.tech

Como o Linux lida com vários separadores de caminho consecutivos (/ home //// nome de usuário /// arquivo)?

Estou trabalhando em um script python que passa os locais dos arquivos para um subprocesso scp. Está tudo bem, mas estou em uma situação em que posso acabar concatenando um caminho com um nome de arquivo tal que há um duplo '/ no caminho. Eu sei que o bash não se importa se você tiver vários separadores de arquivos, mas estou me perguntando como exatamente isso é corrigido. É o bash que tira extra /s ou isso realmente nunca importa?

Eu pergunto porque isso me poupará várias linhas de código para verificar se há extra /s enquanto concatenando. Sei que não é grande coisa, mas também estou curioso. Eu tenho um script bash que tem a linha cd //usr (ao invés de cd /usr), o que parece sugerir que pode haver um significado para o uso de vários /s em um caminho

117
Falmarri

São permitidas várias barras e são equivalentes a uma única barra. A partir da especificação Unix única (versão 4) , definições base §3.271 nome do caminho : “Várias barras sucessivas são consideradas iguais a uma barra.”

Há uma exceção: se um nome de caminho começa com dois caracteres sucessivos, o primeiro componente após os caracteres iniciais pode ser interpretado de uma maneira definida pela implementação. (ref: definições básicas §4.13 resolução do nome do caminho ). O próprio Linux não faz isso, embora alguns aplicativos possam fazer e outro sistema unix-ish (por exemplo, Cygwin).

Um / À direita no final de um nome de caminho força o nome do caminho a se referir a um diretório. Nas definições básicas ( POSIX 1003.1-2001 (Single Unix v4), §4.11, resolução do nome do caminho , um final / É equivalente a um final /.. POSIX 1003.1-2008 (Single Unix v4) definições básicas §4.1 remove o requisito de torná-lo equivalente a /., Para lidar com diretórios inexistentes (por exemplo, é necessário mkdir foo/ trabalho, enquanto mkdir foo/. não - veja o racional para a alteração).

Para programas que atuam em uma entrada de diretório, se foo for um link simbólico para um diretório, passar foo/ É uma maneira de fazer o programa atuar no diretório em vez do link simbólico.

¹ Observe que isso se aplica apenas à resolução do nome do caminho, ou seja, ao acessar arquivos. Manipulações de nome de arquivo podem funcionar de maneira diferente. Por exemplo basename e dirname ignora as barras finais.

173

O sistema operacional também não parece se importar com isso, tendo acabado de experimentar um programa C com um syscall direto para abrir com um // no caminho.

Você pode usar a função da biblioteca python os.path.normpath para normalizá-la, o que evita que você tenha que procurar na cadeia procurando por extras. Outros idiomas têm funções semelhantes.

http://docs.python.org/library/os.path.html#os.path.normpath

17
Ivatar

Em todos os sistemas Unix que vi, é igual a um único /, Mas o padrão Unix especifica que

Um nome de caminho que começa com duas barras sucessivas pode ser interpretado de uma maneira definida pela implementação, embora mais de duas barras principais sejam tratadas como uma única barra.

portanto, ele pode ser tratado especialmente, dependendo do seu sistema. (Algumas versões mais antigas do Unix usavam um duplo / Para acesso remoto ao sistema de arquivos, e ainda pode haver algumas.

9
Fred Foo

Usar os.path.join in Python e você não terá várias barras. A criação de nomes de arquivos concatenando cadeias de caracteres é considerada pobre Python.

7
Neil Mayhew

Não há diferença.

Várias barras são ignoradas (sem efeito), por exemplo:

ls -al //usr///////bin/sed
3
ChristopheD

Obviamente, você pode normalizar um caminho com possíveis múltiplos/(barras) passando-o por tr -s

NORMALIZED=$(echo "$UNHYGIENIC" | tr -s / /)

... e depois use $NORMALIZED

No entanto, deve ser necessário. Pelo que sei, qualquer kernel UNIX deve ignorar os separadores de caminho simultâneos --- ou tratá-los conceitualmente como ..././...

0
Jim Dennis