How are the above . & .. used in the shell command line?
De muitas maneiras, dependendo do contexto. Ilustrações simples:
- Para resolução de caminho com o comando
cd
incorporado, por exemplo, como você disse -
Literally
, dentro de um padrão, por exemplo, no contexto da expansão do nome do caminho - Em
pattern
para substituir qualquer caractere único com um comando comogrep
Considere man cd
, man path_resolution
e esta explicação sobre como o comando cd
interno funciona internamente ( man cd
aqui):
(4). If the first component of the directory operand is dot or dot-dot, proceed to step 6.
(6). Set curpath to the string formed by the concatenation of the value of PWD, a slash character, and the operand.
(8). The curpath value shall then be converted to canonical form as follows, considering each component from beginning to end, in sequence:
a. Dot components and any slashes that separate them from the next component shall be deleted.
b. For each dot-dot component, if there is a preceding component and it is neither root nor dot-dot, the preceding component, all slashes separating the preceding component from dot-dot, dot-dot and all slashes separating dot-dot from the following component shall be deleted. ...
e este, que é um exemplo passo-a-passo de como as etapas acima aparentemente se aplicam à alteração do diretório de /home/user
para ../../boot/memtest86
:
# echo $PWD
/home/user
(4). cd ../../boot/memtest86
(6). curpath = /home/user/../../boot/memtest86
(8)b
/home/user/../../boot/memtest86
/home/../boot/memtest86 //step 1
/ boot/memtest86 //step 2
curpath = /boot/memtest86 //result
Ao aparar componentes de pontos na mesma extensão que a profundidade do diretório de trabalho, inevitavelmente isso produz um caminho expresso a partir da raiz. Os passos para um único caso de ponto, etc., foram ignorados, pois ele concatena como acima, depois remove ./
, o que é muito fácil de imaginar, já que estamos no diretório atual. Isso ilustra como .
e ..
referenciando o diretório atual e pai são implementados no contexto desse comando internamente, o que não é por meio de "substituição", mas sim algo semelhante à edição de fluxo ...
Você pode investigar a expansão do nome do caminho e a correspondência de padrões em bash
After word splitting, unless the -f option has been set (see The Set Builtin), Bash scans each word for the characters *, ?, and [...] If one of these characters appears, then the word is regarded as a pattern, and replaced with an alphabetically sorted list of file names matching the pattern. ...
Em um padrão para um nome de caminho como este, qualquer caractere diferente de *
, ?
e [...]
corresponde a si mesmo. Isso significa que um ponto pode se corresponder literalmente:
ls .*
... expandirá para ..
, .
(porque * inclui também nulo) e, consequentemente, listará o diretório atual e pai e também qualquer arquivo ou diretório no diretório atual que literalmente comece com um ponto (. * ) e é seguido por algo mais de qualquer tamanho. Conforme explicado no manual, você tem algum nível de controle sobre o comportamento da expansão, etc. (usando as opções * glob para set
e shopt
).
Aqui está um exemplo do caractere sendo usado em um padrão (como é grep pattern file
1 ) para selecionar qualquer caractere, e é claro não relacionado a nomes de arquivos ou diretórios:
ls -la | grep .
Isso imprime o conteúdo do diretório para que ele capture tudo ( grep -v .
é usado para capturar linhas vazias ). Geralmente com padrões em tais expressões e certamente esse é o caso de grep
, um único ponto corresponde a qualquer caractere único. Finalmente, considere estes caracteres especiais exemplos na seção .
do ponto para um lembrete rápido de alguns os diferentes casos de uso.
Assim, um ponto pode ser usado na resolução do caminho, como um caractere literal que faz parte de um padrão, ele pode substituir um único caractere em uma expressão com grep
e pode ser até mesmo uma bash builtin usado para executar comandos de um arquivo etc. Como é usado na linha de comando varia com contexto ...
1. Isto é claro sobre a sintaxe de um comando específico. Se um comando aceita um arquivo / caminho como um argumento, então, usando o ponto em seu lugar, como outros mostraram, expande para o diretório de trabalho atual, o que é bastante conveniente.