Nos componentes de nome de caminho no Unix, apenas dois caracteres não podem ser usados: o caractere nulo, que termina as cadeias em C (o idioma do kernel) e a barra, que é reservada como o separador de caminho. Além disso, os componentes do caminho não podem ser cadeias vazias.
Assim, em um nome de caminho, temos apenas dois tipos de tokens: uma barra e um componente.
Suponha que, sem adicionar novos tokens , gostaríamos de apoiar dois tipos de caminhos, relativo e absoluto. Além disso, gostaríamos de poder nos referir ao diretório raiz, que não tem nome (não tem pai que lhe daria um nome).
Como podemos representar caminhos relativos, caminhos absolutos e nos referir ao diretório raiz, usando apenas a barra?
A maneira mais óbvia de estender uma linguagem (além da introdução de um novo token) é criar uma nova sintaxe: dar um novo significado às combinações de tokens que são sintaxes inválidas.
Os caminhos que começam com uma barra não fazem sentido, então por que não usar uma barra como um marcador que indica "esse caminho é absoluto, e não relativo".
Um caminho que contém nada além de uma barra também é inválido, então por que não atribuir o significado "o diretório raiz".
Esses dois significados se unem porque um caminho absoluto começa a pesquisar no diretório raiz. Em outras palavras, uma barra principal pode ser considerada como tendo o significado:
- navegue até o diretório raiz e consuma o caractere de barra.
- se houver mais material no caminho, processe-o como um caminho relativo, caso contrário, você estará pronto.
Em seguida, podemos também incluir uma barra à direita, que pode significar "esse caminho afirma que o último componente de caminho é o nome de um diretório em vez de um arquivo regular ou qualquer outro tipo de objeto: essa barra indica diretório da mesma forma que a barra inicial indica o diretório raiz. "
Com toda a sintaxe acima, ainda temos a sintaxe com um significado não atribuído: barras duplas, barras triplas e assim por diante.
Por que não basta introduzir outro token e fazê-lo de forma diferente. Isto é provavelmente porque os designers usaram abordagens minimalistas em geral. (Por que o editor ed
exibe apenas ?
quando você faz algo errado?) A barra é fácil de digitar, não exigindo nenhum deslocamento. Uma linguagem de caminho com apenas dois tipos de token (componente e barra) é fácil de lembrar e usar.
Outra consideração importante é que as manipulações fáceis de caminhos são possíveis usando apenas representações de strings. Por exemplo, podemos "re-root" caminhos absolutos para um novo diretório pai com bastante facilidade:
OLD_PATH=/old/path
NEW_HOME=/new/home
NEW_PATH="$NEW_HOME$OLD_PATH" /new/home/old/path
Isso não funcionaria se indicássemos caminhos absolutos de alguma outra forma, como um símbolo de dólar ou qualquer outra coisa:
OLD_PATH=^old/path # ^ means absolute path
NEW_HOME=^new/home
# now we need more string kung-fu than just catenation
NEW_PATH="$NEW_HOME/${OLD_PATH#^}"
Esse tipo de codificação ainda é necessário em alguns casos ao lidar com caminhos no estilo Unix, mas há menos deles.