Como impedir que o comando 'cd' vá para o diretório inicial?

10

O problema é que, às vezes, digito cdpor engano e isso me leva ao diretório inicial.

por exemplo, estou em um diretório que possui um diretório oculto e um diretório visível, pressiono rapidamente cd+ tabe isso me leva ao diretório inicial

vinicius de novaes
fonte
30
Se você estiver em cdalgum lugar por acidente, use cd -para retornar ao seu local anterior - o bash mantém a $OLDPWDvariável para esse fim. Veja gnu.org/software/bash/manual/bash.html#index-cd
glenn jackman
4
Se você realmente quer cdfazer nada, você pode escrever uma função chamada cdque não faz nada quando nenhum argumento for dado, caso contrário, chamarbuiltin cd "$@"
glenn jackman
2
Uma péssima idéia: HOME =.
Joshua
26
Minha melhor recomendação sincera é diminuir a velocidade e aprender a verificar o comando antes de executá-lo. Em outras palavras: acostume-se a cdfazer o que faz. Se você mantiver o hábito de executar comandos que não verificou duas vezes, terá problemas muito maiores posteriormente. Por exemplo, você deseja mover dois arquivos para um terceiro diretório: mv a b dir/e a conclusão do TAB não produz o dirque você espera, você acabará executando mv a bquais substituições b. Aprenda a ter cuidado, aprenda a dar uma olhada no comando antes de pressionar Enter.
egmont
1
@ Joe Eu escrevi um script wrapper para rmpara evitar a exclusão de diretórios de nível superior, como /, /etc, /usr, /home, /var, etc, sem uma substituição de senha. Às vezes, precisamos de proteção contra nós mesmos :) #
WinEunuuchs2Unix

Respostas:

14

Use gedit ~/.bashrce insira estas linhas na parte inferior:

cd() {
    [[ $# -eq 0 ]] && return
    builtin cd "$@"
}

Abra um novo terminal e agora, quando você digita cdsem parâmetros, simplesmente fica no mesmo diretório.


TL; DR

Se você quer ser realmente elaborado, pode colocar em uma tela de ajuda quando nenhum parâmetro for passado:

$ cd

cd: missing operand

Usage:

    cd ~            Change to home directory. Equivelent to 'cd /home/$USER'

    cd -            Change to previous directory before last 'cd' command

    cd ..           Move up one directory level

    cd ../..        Move up two directory levels

    cd ../sibling   Move up one directory level and change to sibling directory

    cd /path/to/    Change to specific directory '/path/to/' eg '/var/log'

O código expandido para fazer isso é:

cd() {
    if [[ $# -eq 0 ]] ; then
        cat << 'EOF'

cd: missing operand

Usage:

    cd ~            Change to home directory. Equivelent to 'cd /home/$USER'

    cd -            Change to previous directory before last 'cd' command

    cd ..           Move up one directory level

    cd ../..        Move up two directory levels

    cd ../sibling   Move up one directory level and change to sibling directory

    cd /path/to/    Change to specific directory '/path/to/' eg '/var/log'

EOF
        return
    fi

    builtin cd "$@"
}
WinEunuuchs2Unix
fonte
6
Mas então você fez seu ambiente funcionar como nenhum outro ambiente. Por que não chamar a função ncd(para "New cd") e deixar em cdpaz?
waltinator
@waltinator Posso melhorar a resposta com um aviso sobre como cd (em branco) funciona de maneira diferente para outras pessoas, além do usuário doméstico ~/.bashrc. Você poderia dar um ou dois exemplos do que observar? por exemplo, um desenvolvedor usa cd (em branco) em seu script de instalação. (Hipotético, mas não consigo pensar em um caso). Posso juntar seus exemplos na resposta e sugerir que o OP use ncdo tempo todo em vez de cd.
WinEunuuchs2Unix 23/10
Adoro personalizar as coisas. É disso que se trata o Linux. Mas eu tenho uma regra pessoal estrita de nunca alterar a função (sem trocadilhos) de nenhum comando comum. Isso abre problemas quando você trabalha em outro sistema ou quando alguém trabalha ou o aconselha sobre o seu. Eu concordo com o @waltinator e com o outro "bom" Joe
Joe
6

Se a conclusão da guia está causando isso, uma opção é fazer o ciclo de conclusão pelas entradas imediatamente. Isso pode ser feito usando amenu-comple opção readline em vez do padrão complete:

bind 'tab: menu-completion'

Em seguida, no meu diretório pessoal, por exemplo:

$ cd <tab> # becomes
$ cd .Trash

Claro, mesmo assim você teria que ler o que está executando.

muru
fonte
4

Aqui está como eu coloco o diretório e o usuário atuais no título do meu Windows - você pode adaptá-lo às suas necessidades, mas o cd -equivalente a cd $OLDPWDuma solução melhor.

Do meu ~/.bashrc:

# from the "xttitle(1)" man page - put info in window title
update_title()
{
    [[ $TERM = xterm ]] || [[ $TERM = xterm-color ]]  && xttitle "[$$] ${USER}@${HOSTNAME}:$PWD"
}

cd()
{
    [[ -z "$*" ]] && builtin cd $HOME
    [[ -n "$*" ]] && builtin cd "$*"
    update_title
}
waltinator
fonte
4

O problema aqui não é cd, e não é corrigido pela tecnologia.

O problema é você e é corrigido pela paciência!

Se você costuma digitar e enviar comandos que não deseja, pratique a desaceleração . Respire fundo, leia o que você está digitando e verifique novamente antes de pressionar enter. Pensar sobre isso. Não se apresse.

Você descobrirá que essa abordagem não apenas resolve o problema em questão, mas também outros problemas muito piores que você encontrará se continuar no caminho atual.

Raças de leveza em órbita
fonte
2
Além disso, após alguns meses / anos de uso, você esquecerá que mudou o comportamento e terá problemas para trabalhar em outros ambientes.
PLumo # 23/18
@RoVo Isso também, bom ponto!
Lightness Races in Orbit -
@RoVo Isso pode acontecer em alguns dias. Imediatamente, se você inicializar duas vezes, mude para uma VM ... #
315 Joe Joe
@ Joe Ultimamente, eu tenho alternado entre o OSX durante o dia e o Windows à noite e a alteração no layout do teclado é realmente confusa!
Lightness Races em órbita
@LightnessRacesinOrbit Tenho certeza! Eu tenho dois teclados de notebook de tamanhos diferentes, com quase o mesmo layout, e isso é ruim o suficiente. É também por isso que nunca experimentei um teclado Dvorak. Só não tenho certeza de como isso se relaciona com a pergunta.
Joe