Respostas:
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$
Você pode usar o builtin
comando no bash:
function cd() {
new_directory="$*";
if [ $# -eq 0 ]; then
new_directory=${HOME};
fi;
builtin cd "${new_directory}" && ls
}
function ls() { /usr/bin/ls $* }
cd
porque rvm
altera minha cd
definição também. Veja stackoverflow.com/a/19941991/1601989
Use uma função em vez de um alias:
cs() { cd "$1" && ls; }
Obrigado Florian Diesch pela dica de uso de uma função. Não posso usar cs
como nome porque há um cs
comando no pacote csound , então usei lc
.
Adicionei isso a ~/.bash_aliases
( nano ~/.bash_aliases
):
function lc () {
cd $1;
ls
}
O terminal precisa ser reset
para que isso entre em vigor.
$1
nã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; }
Como uma expansão para esta função: cs() { cd "$1" && ls; }
, você pode querer passar todos os argumentos da função para cd
usando $@
em vez de "$1"
como tal: cs() { cd $@ && ls; }
.
Tive problemas para redefinir cd
porque rvm
altera minha cd
definição também. Consulte https://stackoverflow.com/a/19941991/1601989 . Eu realmente não queria usar builtin
porque isso pularia o que rvm
estiver 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 rmv
linha no .bashrc
:
alias cd='cdd'
# Use bash built in completion for cd to allow for filenames to be used
complete -r cd