Crie uma função:
crdir() {
if [ "$#" -eq 1 ]; then
mkdir -p -- "$1" && cd -P -- "$1"
else
echo >&2 "Usage: crdir <directory-path>"
return 1
fi
}
Que você pode colocar em seu ~/.bashrc .
Sua abordagem . crdir também funcionaria (em bash e outros shells cujo . pode receber argumentos), mas você precisará remover esse exit 0 que faz com que o shell seja encerrado. Observe também que, quando não estiver no modo POSIX, bash procurará o arquivo para a origem no diretório atual, se ele não puder ser encontrado em $PATH , o que o torna um pouco perigoso (no mesmo nível que a adição de . ou uma entrada vazia no final de $PATH ).
Além disso, se . crdir for chamado sem argumentos, o script herdará o parâmetro posicional do shell. Por exemplo, set foo; . crdir não retornaria um erro e criaria o diretório foo .
Algumas outras notas no seu script:
#!/bin/bash
Observe que a explosão é ignorada (é apenas vista como um comentário) quando o arquivo é originado.
if [[ $# -ne 1 ]]; then echo "only use one argument"
É preferível enviar mensagens de erro no stderr ( echo >&2 text ).
exit 1 fi mkdir $1
Deixar expansões de parâmetros sem aspas tem um significado especial em bash , você quase nunca deve fazer isso.
Além disso, se $1 começar com - , ele será tratado como uma opção por mkdir . Você precisaria usar o marcador -- fim-de-opção para informar mkdir o conteúdo de $1 não é uma opção, mesmo que comece com - .
Você também não está verificando se o comando mkdir foi bem-sucedido.
Você também pode querer usar a opção -p que informa mkdir para criar todos os componentes de diretório e também faz com que mkdir não retorne falha se o diretório já existir. Então:
mkdir -p -- "$1" &&
sleep 0.5
Não precisa dormir. Você pode ter certeza de que o diretório foi criado quando mkdir retornar com êxito.
cd $1
Novamente, você tem os problemas de cotação e - . Além disso, em bash você precisa da opção -P para cd para interpretar caminhos da mesma maneira que outros utilitários como mkdir . Então:
cd -P -- "$1"
(ignorando por enquanto um caminho chamado - ou $CDPATH , que eu espero que você não use ou use apenas com valores sônicos).
exit 0
Novamente, você não está verificando o status de saída de cd e retornando com um status de saída sucesso , mesmo se mkdir ou cd falhar. Quando um script é originado, ele é interpretado pelo shell de origem, para que exit faça com que ele saia.
Aqui, eu reescreveria o script como:
if [ "$#" -eq 1 ]; then
mkdir -p -- "$1" && cd -P -- "$1"
else
! echo >&2 "Usage: crdir <directory-path>"
fi