É 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)"