Eu tenho uma função, que eu espero que me dê uma pesquisa difusa nos diretórios mais recentes que eu estive olhando e me economize tempo, um simples 1 liner:
dirs | sed 'y/ /\n/' | fzf | xargs cd
2 horas depois, não consigo descobrir o que está errado):
Eu continuo recebendo erros como:
/usr/bin/cd: line 4: cd: ~/Downloads/demo: No such file or directory
Mesmo quando o diretório existe, não importa o que eu faça. O que está acontecendo com o cd, por que isso não funciona?
Obrigado pelo comentário: Mais informações Eu tentei algumas outras maneiras, como escrever uma função:
fdr() {
local dir
dir=`dirs | sed 'y/ /\n/' | fzf`
cd $dir
}
Mesmo tendo dir
o valor correto, recebo o mesmo erro visto acima.
Minha última função
Obrigado pela ajuda, sub shells estavam fazendo minha cabeça, aqui está minha resposta final, pouco hackey, mas o que não é nos dias de hoje.
fdr() {
local dir
myusernmae=`whoami`
dir=`dirs | sed 'y/ /\n/' | sed "s/~/\/Users\/$myusernmae/g" | fzf +m`
cd "$dir"
}
Há três questões aqui:
O nome do caminho do diretório é fornecido
cd
como a string literal~/Downloads/demo
, embora o caminho correto possa ser algo como/Users/snickers/Download/demo
.Normalmente, quando você digita
cd ~/Downloads/demo
na linha de comando, o shell expandirá o til para o caminho do seu diretório inicial antes de executar ocd
comando. Isso não acontece aqui porque a expansão do til acontece antes da expansão da variável (veja " Como entender a ordem entre as expansões? ").Supondo que você esteja usando o
bash
shell, usingdirs -l
pode contornar esse problema, permitindodirs
a saída do caminho completo.cd
é um comando interno do shell. Em sua máquina macOS, ele também está disponível como o comando externo/usr/bin/cd
, e é por isso que você não está recebendo um erro "comando não encontrado" como muitos outros usuários do Unix obteriam ao usarcd
comxargs
. No entanto, um comando externocd
nunca pode alterar o diretório do shell atual. Isso é descrito em " Por que o cd não é um programa? " e " onde está localizado o `cd`? " e em questões semelhantes. Sua variação de função do shell ignora esse problema, pois está usando o comando interno do seu shellcd
.O último problema, que é uma variante do 2º problema e que realmente não entra em jogo por causa dos outros problemas, é que o
cd
comando, quando executado porxargs
, não é apenas um comando externo que não pode alterar o diretório de trabalho para o shell de chamada, mas o comando que o está chamando éxargs
, que por sua vez está sendo executado em um subshell como um estágio do pipeline. Alterar o shell em um subshell não o alterará no shell pai.Você deve ser capaz de usar
onde
dirs -l -p
gera um diretório da pilha de diretóriosbash
por linha, com tils expandidos. Isso pressupõe que você não tenha diretórios na pilha com novas linhas incorporadas em seus nomes, mas oferecerá suporte a diretórios com espaços (o que sua própria função não faz, em parte por causa dassed
transformações e em parte por não citar a expansão de$dir
).