Como posso suprimir a impressão do caminho completo para subdiretórios ao usar CDPATH = “.: / some / path”?

1

Eu quero usar o CDPATH do bash para apontar para um diretório de links simbólicos para diretórios que eu acesso com frequência. No entanto, fazendo:

export CDPATH="~/symlinks"

faz com que cd SUBDIR pare de funcionar se ./SUBDIR e ~/symlinks/SUBDIR existirem; Os diretórios CDPATH têm precedência sobre o diretório de trabalho atual.

Eu tentei corrigir isso usando:

export CDPATH=".:~/symlinks"

e isso corrige o problema de precedência, mas agora cd ing para um subdiretório sempre imprime seu caminho completo:

$ pwd
/foo/bar
$ cd baz
/foo/bar/baz

Isso é um pouco chato. Eu sei que posso suprimir toda a saída cd fazendo alias cd='> /dev/null cd' , mas eu gosto do caminho sendo impresso para outras entradas CDPATH (ou ao fazer cd - ). Existe algo melhor que eu possa fazer?

    
por jamesdlin 17.07.2018 / 23:23

1 resposta

2

Duas pistas:

  • Se CDPATH for inexistente ou uma string vazia, então cd SUBDIR funciona bem e não imprime spew extra.

  • O bash manpage diz:

    The variable CDPATH defines the search path for the directory containing dir: each directory name in CDPATH is searched for dir. Alternative directory names in CDPATH are separated by a colon (:). A null directory name in CDPATH is the same as the current directory, i.e., ''.''.

A manpage parece estar simplificando demais: claramente um nome de diretório nulo (ou seja, uma string vazia) é não exatamente igual a . , pois CDPATH=. gera saída extra, mas CDPATH= faz não. No entanto, como os diretórios nulos são legais em CDPATH e como um diretório nulo não gera saída extra, podemos, portanto, usar:

# The first entry is intentionally an empty string.
export CDPATH=":~/symlinks"

O teste (com bash 4.4.12) confirma que se comporta como desejado: cd SUBDIR muda para ./SUBDIR ao invés de ~/symlinks/SUBDIR e não imprime spew extra.

    
por 17.07.2018 / 23:23