Encontro-me repetindo muito:
mkdir longtitleproject
cd longtitleproject
Existe uma maneira de fazer isso em uma linha sem repetir o nome do diretório? Estou na festa aqui.
bash
shell
command-line
methodofaction
fonte
fonte
mcd
A partir de unix.stackexchange.com/questions/6628/…mkdir longtitleproject
entãocd !^
Respostas:
Não há comando interno, mas você pode escrever facilmente uma função que chama
mkdir
entãocd
:Coloque esse código no seu
~/.bashrc
arquivo (ou~/.kshrc
para usuários ksh ou~/.zshrc
para usuários zsh). Ele define uma função chamadamkcd
."$1"
será substituído pelo argumento da função quando você a executar.Esta versão simples possui vários defeitos:
-p
opção paramkdir
. (Isso pode ou não ser desejável, pois aumenta o risco de um erro de digitação não ser detectado, por exemplo,mkcd mydierctory/newsub
criará com alegriamydierctory
emydierctory/newsub
quando você pretende criarnewsub
dentro do existentemydirectory
.)-
, mas não é apenas-
, em seguida,mkdir
ecd
irá interpretá-lo como uma opção. Se for justo-
, entãocd
o interpretará como significando$OLDPWD
. Se for+
seguido por 0 ou mais dígitos, ocd
zsh o interpretará como um índice na pilha de diretórios. Você pode corrigir o primeiro problema, mas não os outros dois, passando--
antes do argumento. Você pode corrigir todos esses problemas anexando./
o argumento se for um caminho relativo.mkdir
não segueCDPATH
, mas segue ;cd
portanto, se você definiuCDPATH
um valor que não começa com.
(uma configuração reconhecidamente um tanto incomum),cd
poderá levá-lo para um diretório diferente daquele que foi criado. A adição./
de caminhos relativos corrige isso (fazCDPATH
com que seja ignorado).mkdir
falhar, ele tenta executarcd
. Correção: use&&
para separar os dois comandos.Ainda bastante simples:
Essa versão ainda tem o potencial de
cd
entrar em um diretório diferente daquele quemkdir
acabou de ser criado em um caso de borda: se o argumentomkcd
contiver..
e passar por um link simbólico. Por exemplo, se o diretório atual é/tmp/here
emylink
é um link simbólico para/somewhere/else
, em seguida,mkdir mylink/../foo
cria/somewhere/else/foo
enquantocd mylink/../foo
muda parafoo
. Não é suficiente procurar links simbólicos no argumento, porque o shell também rastreia links simbólicos em seu próprio diretório atual, portantocd /tmp/mylink; mkdir ../foo; cd ../foo
, não muda para o novo diretório (/somewhere/else/foo
), mas para/tmp/foo
. Uma correção para isso é permitir que ocd
interno resolva todos os..
componentes do caminho primeiro (não faz sentido usarfoo/..
sefoo
não existe, entãomkdir
nunca precisa ver nenhum..
).Chegamos a esta versão robusta, embora um pouco sangrenta:
(Exercício: por que estou usando um subshell na primeira
cd
chamada?)Também existem maneiras menos especializadas de não precisar digitar novamente a palavra da linha anterior:
cd
, então Esc .(ou Alt+ .) para inserir o último argumento do comando anterior.cd !$
executacd
no último argumento do comando anterior.mkdir
paracd
.fonte
ksh
, e também funciona emzsh
) para "repetir a última palavra do comando anterior". Eu o uso com bastante frequência./a/b/..//
realmente funcionaria, mas não/a/b/../c
. Fixo. Eu coloquei a questão para um público mais amplo.mkcd() { mkdir -p "$1" && cd "$1"; }
não parece ser um problema no (meu exemplo de) zsh.mkdir -p /var/tmp/somewhere/else /tmp/here; cd /tmp/here; ln -s /var/tmp/somewhere/else mylink; mkdir -p mylink/../foo && cd mylink/../foo; pwd
(inclui a configuração e) exibe o/tmp/here/foo
que foi criado (e o que eu esperava).bash
cria e altera erroneamente para/var/tmp/somewhere/foo
.Este é o one-liner que você precisa. Nenhuma outra configuração é necessária:
A
$_
variável, em bash, é o último argumento dado ao comando anterior. Nesse caso, o nome do diretório que você acabou de criar. Como explicado emman bash
:Use
cd $_
para recuperar o último argumento do comando anterior em vez decd !$
porquecd !$
fornece o último argumento do comando anterior no histórico do shell :você acaba em casa (ou ~ /)
você acaba em uma nova pasta em casa !! (ou ~ / nova pasta)
fonte
mkdir foo && cd foo
, o que não é útil.Nunca me ocorreu escrever esse comportamento porque eu insiro o seguinte quase que de hora em hora ...
onde bash gentilmente substitui
!$
a última palavra da última linha; ou seja, o nome do diretório longo que você digitou.Além disso, a conclusão do nome do arquivo é seu amigo nessas situações. Se o seu novo diretório fosse o único arquivo na pasta, um duplo rápido TABforneceria o novo diretório sem precisar digitá-lo novamente.
Embora seja legal que o bash permita que você crie scripts de tarefas comuns, como as outras respostas sugerem, acho melhor aprender os recursos de edição de linha de comando que o bash tem a oferecer para que, quando você estiver trabalhando em outra máquina, não perca a sintaxe sintática. açúcar que seus scripts personalizados fornecem.
fonte
De acordo com Quais personalizações você fez no seu perfil de shell para aumentar a produtividade? , é assim que eu faço:
significa que também funciona se o diretório já existir.
fonte
-p
opção para mkdir suprimirá erros.mcd
comando existente ? Qual pacote ou projeto fornece esse comando?Se você usar Oh My Zsh, há um comando chamado take que faz exatamente isso. Seria algo assim.
Na verdade, encontrei este por acidente. Eu apenas olhei e está listado neste truque do wiki Oh My Zsh GitHub. É um comando bastante útil e aparentemente muito fácil de se criar.
fonte
take
:) Perfeito! btw - iTerm2 com Oh My Zsh. Na verdade, existem 3 respostas perfeitas aqui. Este, o de @ jesús-carrera, e a resposta selecionada. Depende da sua configuração e preferência.Ou você pode simplesmente criar uma variável curta on-the-fly e usá-la duas vezes
x = longproject ; mkdir $x ; cd $x
- o que eu admito que ainda é mais do que usar uma função shellscript :)fonte
Aqui está uma pequena variante que vale a pena mencionar:
Adicione isso ao seu
~/.bash_profile
e você poderá usá-lomkdir
normalmente (assim que o desejarsource
), exceto que agora ele executará a função acima, em vez domkdir
comando padrão .Observe que isso não valida a entrada de acordo com a resposta aceita por Gilles , mas demonstra como você pode (efetivamente) substituir os componentes internos.
Dos documentos (parafraseando um pouco):
Eu acredito que
builtin
alcança um resultado semelhante aocommand
.fonte
$dir
command
como alternativa.Adicionando função auxiliar ao BASH, ZSH ou KSH
Crie
mkcd
comando para o seu ambiente em uma linhafonte
Eu criei um script que cria o diretório e, em seguida, o CD, e dei um apelido. E aqui está uma essência onde eu a descrevo.
https://gist.github.com/rehnen/34236d6ff270ccaa74b6#mkdir-like-it-was-meant-to-be
fonte
Apenas automatizou as respostas acima e criou um script executável único:
Apenas copie isso em um novo arquivo
mkcd.sh
e execute-o apenas uma vez no terminal porbash mkcd.sh
. Em seguida, executesource ~/.bashrc
para fazê-lo funcionar na sessão atual.Depois disso, você pode usar
mkcd some_dir
para criar e inserir diretamente nesse diretório.fonte
~/.bashrc
arquivo (com uma resposta que já foi dada)? E como você sugere a criação dessemkcd.sh
script? Com um editor, talvez? Parece mais trabalho do que apenas editar~/.bashrc
. Que vantagem isso tem sobre a resposta aceita? ....