Como posso criar um alias para cd e ls?

32

Eu frequentemente executo o lscomando depois de executá-lo cd. Como posso criar um alias (como cs) para esta operação?

dv3500ea
fonte

Respostas:

35

De Bash Tips and Tricks: 'cd' com estilo :

Por fim, quero mostrar como escrever sua própria substituição personalizada para o comando 'cd'.

Você sempre digita a mesma coisa ao mudar para um diretório? Você provavelmente lista pelo menos os arquivos sempre, talvez tanto que suas mãos digitam automaticamente 'ls' após cada 'cd'.

Bem, ao tentar de todas as formas que pude pensar, verifica-se que há apenas uma maneira de atingir adequadamente o objetivo que estamos buscando. Temos que criar uma função shell.

As funções do shell fazem parte da programação do shell. Como nas linguagens de programação compiladas, as funções fornecem uma espécie de capacidade modular de procedimento. Pode-se criar uma função genérica para executar um pouco de lógica ou computação frequentemente usado com parâmetros diferentes. Nesse caso, o parâmetro é o diretório de trabalho atual.

Aqui está um exemplo simples:

function cs () {
    cd $1
    ls
}

Como o @geirha observa corretamente, a função acima falhará se você tentar alternar para um diretório com um espaço em seu nome:

$ cs A\ B/
-bash: cd: A: No such file or directory
<current directory listing>  

Você deve usar a seguinte função:

function cs () {
    cd "$@" && ls
    }

Depois de adicionar esse código ao seu ~/.bashrc, você poderá fazer o seguinte:

hello@world:~$ cs Documents/
example.pdf tunafish.odt
hello@world:~/Documents$
Isaías
fonte
1
Isso falhará nos diretórios que contêm espaço em branco. Veja o comentário na resposta do dv3500ea.
geirha
24

Você pode usar o builtincomando no bash:

function cd() {
    new_directory="$*";
    if [ $# -eq 0 ]; then 
        new_directory=${HOME};
    fi;
    builtin cd "${new_directory}" && ls
}
OneOfOne
fonte
2
Isso é bem liso. Eu tive uma solução semelhante ao @Florian no meu .bashrc por um longo tempo, mas isso é muito mais satisfatório para quando esqueço que os colegas não têm o apelido de 'cs' em seus computadores.
dino
Eu gosto desta resposta da melhor maneira. Por alguma razão, você não pode usar aliases para substituir o comando, portanto, você deve executar uma função como esta resposta. : D
trusktr 30/10/12
Mas e os comandos não integrados? Por exemplo, o acima não funcionará para substituir o comando ls. Existe alguma palavra-chave para usar em vez de "builtin"?
trusktr
use o caminho completo para isso, por exemplo:function ls() { /usr/bin/ls $* }
OneOfOne
Tive problemas para redefinir cdporque rvmaltera minha cddefinição também. Veja stackoverflow.com/a/19941991/1601989
DavidG
16

Use uma função em vez de um alias:

cs() { cd "$1" && ls; }
Florian Diesch
fonte
5
+1, pois esta versão será interrompida se 'cd' falhar.
precisa saber é o seguinte
9

Obrigado Florian Diesch pela dica de uso de uma função. Não posso usar cscomo nome porque há um cscomando no pacote csound , então usei lc.

Adicionei isso a ~/.bash_aliases( nano ~/.bash_aliases):

function lc () {
    cd $1;
    ls 
}

O terminal precisa ser resetpara que isso entre em vigor.

dv3500ea
fonte
8
Tendo $1não cotadas como que irá torná-lo falhar se o diretório contém espaços em branco. Além disso, você deve verificar o valor de retorno de cd; se falhou (por exemplo, permissão negada), não faz sentido executar o ls. lc() { cd "$@" && ls; }
Geirha
1

Como uma expansão para esta função: cs() { cd "$1" && ls; }, você pode querer passar todos os argumentos da função para cdusando $@em vez de "$1"como tal: cs() { cd $@ && ls; }.


fonte
1

Tive problemas para redefinir cdporque rvmaltera minha cddefinição também. Consulte https://stackoverflow.com/a/19941991/1601989 . Eu realmente não queria usar builtinporque isso pularia o que rvmestiver fazendo.

Eu adicionei o seguinte ao meu .bashrc:

# cdd allows you to cd to the directory of the given file or directory
function cdd()
{
  if [[ $# -eq 0 ]]; then
    cd
  elif [[ -d "$*" ]]; then
    cd "$*"
  elif [[ -f "$*" ]]; then
    echo "WARNING: file given, cd to file's dirname" 1>&2
    local dir=$(dirname "$*")
    cd "$dir"
  else
    cd "$*"
  fi
}

function cs()
{
  cdd $* && ls
}

E depois da rmvlinha no .bashrc:

alias cd='cdd'
# Use bash built in completion for cd to allow for filenames to be used
complete -r cd
DavidG
fonte