Como posso ter o cd mkdir no diretório recém-criado? [duplicado]

6

Freqüentemente, eu digito esses comandos no bash:

mkdir something
cd something

Eu quase nunca faço isso:

mkdir something
ls # something in the current directory, not ./something/

E nunca isso:

mkdir something something2

Como posso ter mkdir cd no diretório recém-criado? Com isso quero dizer se eu mkdir something , que o comando cd something é executado imediatamente depois.

Exemplo:

$ pwd
/home/me
$ mkdir something
$ pwd
/home/me/something
    
por programmer5000 20.06.2017 / 21:09

4 respostas

13

Sugiro criar uma função:

function mydir(){ mkdir -p "" && cd ""; }

ele faz o que você quer, você pode adicioná-lo ao seu .bashrc , assim ele estará disponível em todos os seus shells.

  • é o primeiro argumento que você envia para a função, o nome do diretório.

Você pode usá-lo como:

$ mydir ~/my-new-directory
$ pwd
~/my-new-directory

Observação: você pode alterar mydir com mkdir para substituí-lo, no entanto, sugiro um nome personalizado que não exista no sistema como mydir ou cmkdir ; Você pode verificar se existe um comando usando type command .

    
por Ravexina 20.06.2017 / 21:15
12

Usando o último argumento do comando

Você não precisa digitar novamente o nome do diretório criado. Use a variável $_ :

Do manual do bash 4.3:

   _      At shell startup, set to the absolute pathname  used
          to  invoke  the shell or shell script being executed
          as passed in the environment or argument list.  Sub‐
          sequently,  expands to the last argument to the pre‐
          vious command, after expansion.  

Assim, o uso seria assim:

bash-4.3$ mkdir mydir
bash-4.3$ cd $_

Usando o comando composto '{list;}'

Se quisermos usar apenas uma linha, combine os comandos no comando composto { (observe que o espaço inicial antes de { e ponto e vírgula para cada comando é obrigatório):

bash-4.3$ pwd
/home/xieerqi
bash-4.3$ { mkdir mydir;cd $_;}
bash-4.3$ pwd
/home/xieerqi/mydir

É importante observar que essa estrutura de comando {list;} compound é escolhida por um motivo, porque todos os comandos da lista são executados no ambiente shell atual.

E se quisermos evitar digitar tudo de novo e de novo, podemos criar um apelido.

bash-4.3$ alias mkcd='{ IFS= read -r d && mkdir "$d" && cd "$d"; } <<<' 
bash-4.3$ pwd
/home/xieerqi
bash-4.3$ mkcd "mydir"
bash-4.3$ pwd
/home/xieerqi/mydir

Aqui eu usei a variável "$d" para ambos, mas eu poderia ter usado igualmente "$_" :

bash-4.3$ alias mkcd='{ IFS= read -r d && mkdir "$d" && cd "$_"; } <<<'
    
por Sergiy Kolodyazhnyy 20.06.2017 / 21:52
9

Eu costumo seguir mkdir something por cd Alt +. que completa o comando com o último argumento do comando anterior, ou seja, o nome do diretório.

    
por choroba 20.06.2017 / 21:17
6

Função

Você pode fazer uma pequena função , que pode ser armazenada no arquivo ~/.bashrc . Edite o arquivo para adicionar as seguintes linhas,

md () {
 mkdir "" && cd ""
}

Executar

source ~/.bashrc

para fazer a mudança funcionar no terminal atual [window]. A nova função estará lá quando você abrir novos terminais.

O uso de && entre os comandos torna o comando cd executado somente se o comando mkdir for bem-sucedido.

Exemplo: posso usar a função md desta forma para criar um diretório de teste testdir no diretório atual (neste caso, meu diretório inicial, como visto no prompt), p>

sudodus@xenial32 ~ $ md testdir
sudodus@xenial32 ~/testdir $ 

Bash shellscript não funcionou como eu esperava

Também descreverei minhas dificuldades usando um pequeno shellscript bash para essa finalidade, porque outras pessoas podem tentar e ficar confusas.

Você pode armazenar um shellscript no diretório ~/bin . Depois de criar ~/bin e reinicializar, ele estará no PATH.

Use um nome que não seja usado por nenhum comando padrão (por exemplo mdscript ),

#!/bin/bash

mkdir "" && cd ""

Torne o script executável

chmod ugo+x ~/bin/mdscript

Isso não funciona como pretendido com

mdscript testdir

porque o diretório atual só é alterado no subprocesso do shell-script, mas não no terminal [window] após terminar o shellscript.

Funciona quando 'originado', executado com a linha de comando

source mdscript testdir

mas isso não é conveniente, não é uma boa resposta para a pergunta original.

Você pode ver como funciona, se você adicionar um comando pwd no shellscript

#!/bin/bash

mkdir "" && cd ""
pwd

e execute o script mdscript

sudodus@xenial32 ~ $ mdscript testdir
/home/sudodus/testdir
sudodus@xenial32 ~ $ 
    
por sudodus 20.06.2017 / 21:27