É exatamente o oposto: cp
se comporta como qualquer outro aplicativo, ele interpreta ..
como o diretório pai do diretório atual. Isso porque o kernel interpreta ..
como o diretório pai do diretório atual.
Quando você executa cd
por meio de um link simbólico, o caminho que você passa para cd
não torna o diretório pai do diretório de destino aparente. Quando você executa cd ~/Desktop/subdir
, o destino não é /home/konstantin/Desktop/subdir
- esse é um link simbólico. O diretório de destino é /home/konstantin/Desktop/Public/subdir
. (Ou, para ser pedante: o diretório de destino é um subdiretório chamado subdir
de um subdiretório chamado Public
of… de um subdiretório chamado home
do diretório raiz.) /home/konstantin/Desktop/subdir/..
não é /home/konstantin/Desktop
: a propriedade que o diretório pai de /…stuff…/subdir
é /…stuff…
só é válido na ausência de subdiretórios.
Como é conveniente pensar em links simbólicos para diretórios como se fossem diretórios, os shells executam o rastreamento de links simbólicos. Quando você executa cd
, o shell lembra qual caminho (possivelmente usando links simbólicos) você usou para alcançar o destino. E quando você usa ..
em um argumento para cd
(ou builtins semelhantes de shell como pushd
), o shell executa uma interpretação textual de ..
em vez de interpretá-lo como o diretório atual: cd /some/stuff/../more
é transformado codificar%. Dessa forma, cd /some/more
se comporta como se os links simbólicos fossem realmente diretórios.
A interpretação textual de cd
é conhecida como rastreamento de diretório lógico, e a interpretação do sistema de arquivos de ..
é conhecida como rastreamento de diretório físico.
Se você quiser usar o rastreamento de diretório físico (por exemplo, para desativar a interpretação textual de ..
), passe a opção ..
para -P
. A opção cd
força o rastreamento lógico, caso tenha sido desativado. O rastreamento lógico está desativado por padrão; você pode desativá-lo com -L
no bash ou com set -P
em zsh.
O comando setopt chase_links
exibe o diretório atual conforme rastreado pelo shell. Como pwd
, você pode passar a opção cd
ou -L
para forçar o rastreamento lógico ou físico.
Tudo isso está acontecendo dentro do shell. Aplicativos externos, como -P
, não têm como saber qual rastreamento o shell está fazendo internamente. Portanto, se você quiser usar o rastreamento de diretório lógico em um argumento para um comando, precisará convertê-lo primeiro em um caminho que não dependa do rastreamento lógico.
A variável de shell cp
mantém o controle do diretório atual ( PWD
contém a mesma sequência que $PWD
imprime). Se você quiser remover o último componente textual do caminho rastreado do diretório atual, em vez de anexar pwd
, que só funciona com rastreamento lógico, você pode usar um método textual.
cp testfile "${PWD##*/}"
ou em zsh:
cp testfile $PWD:h
Se você quiser digitar /..
e não precisar pensar em expressar o diretório de maneira diferente, execute ..
no diretório de destino desejado e use o caminho para o destino no argumento do comando.
cp testfile "$(cd .. && pwd)"