Nos componentes de nome do caminho no Unix, apenas dois caracteres não podem ser usados: o caractere nulo, que termina as seqüências de caracteres em C (o idioma do kernel) e a barra, reservada como separador de caminhos. Além disso, os componentes do caminho não podem ser cadeias vazias.
Portanto, 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 oferecer suporte a 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 possui pai, o que 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 um idioma (que não seja a introdução de um novo token) é criar uma nova sintaxe: dê um novo significado às combinações de tokens com sintaxe inválida.
Os caminhos que começam com uma barra não fazem sentido; portanto, por que não usar uma barra inicial como um marcador que indica "esse caminho é absoluto, e não relativo".
Um caminho que não contém nada além de uma barra também é inválido; por que não atribuir a ela o significado "o diretório raiz"?
Esses dois significados se unem porque um caminho absoluto começa a procurar 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 lançar uma barra final, o que pode significar "esse caminho afirma que o último componente do caminho é o nome de um diretório, em vez de um arquivo comum ou qualquer outro tipo de objeto: essa barra final indica esse diretório de maneira semelhante a a maneira como a barra principal indica o diretório raiz ".
Com tudo isso acima, ainda temos uma sintaxe com um significado não atribuído: barras duplas, barras triplas e assim por diante.
Por que não apenas introduzir outro token e fazê-lo de maneira diferente. Isso provavelmente ocorre porque os designers adotaram abordagens minimalistas em geral. (Por que o ed
editor exibe apenas um ?
quando você faz algo errado?) A barra é fácil de digitar, sem necessidade de mudança. Uma linguagem de caminho com apenas dois tipos de token (componente e barra) é fácil de lembrar e usar.
Outra consideração importante é que são possíveis manipulações fáceis de caminhos usando apenas representações de string. 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 maneira, como um cifrão principal 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 quando se lida com caminhos no estilo Unix, mas há menos.
cd /home
é equivalente acd /home/
acrescentar/
no final do nome vazio, fornece acesso a esse diretório.