Criando um alias para alterar o diretório e ter esse diretório como o diretório de trabalho atual nas novas guias de terminal

6

Estou tentando criar um alias de conveniência que altere os diretórios e inicie um servidor de nó nesse diretório. Eu tenho isso funcionando na maior parte, há apenas um pequeno problema que eu não consigo descobrir.

Quando configuro meu alias para alterar apenas o diretório, no meu arquivo ~/.bashrc , obtenho o comportamento esperado:

alias ta='cd /Users/scotty/Develop/Meteor/task-assist' 

E o que quero dizer com comportamento esperado é que quando executo $ ta no terminal, ele não apenas altera o diretório, mas também posso abrir novas guias no terminal e esse diretório é transferido para as novas guias.

Mas, por algum motivo, quando adiciono um comando adicional a esse alias para iniciar um servidor de nó e depois de executar $ ta novamente, o diretório atual não é transferido para as novas guias de terminal (novas guias são abertas na raiz) . O diretório é alterado e o servidor é iniciado, mas é como se o diretório alterado não estivesse definido no terminal. Quando eu mato o servidor ctrl +c , só então o diretório atualiza no terminal. Eu tentei um apelido e uma função para fazer isso funcionar, mas sem sucesso:

### meteor is the command that starts the server
alias ta='cd /Users/scotty/Develop/Meteor/task-assist && meteor'

### Also tried a function
ta(){
  cd /Users/scotty/Develop/Meteor/task-assist
  meteor
}

É quase como se alterar o diretório e executar o meteoro precisem de dois comandos separados para que as novas guias de terminal sejam abertas com o diretório de trabalho atual. E apenas para reiterar e esclarecer melhor, quando eu estiver no terminal e executar $ta e depois pressionar cmd + t para abrir uma nova guia, eu gostaria que o diretório atual das novas guias fosse: /Users/scotty/Develop/Meteor/task-assist .

Alguma idéia de como posso fazer isso acontecer com um alias?

    
por Scott 17.09.2014 / 15:10

2 respostas

2

Você tem que seguir outro caminho. Adicione uma linha no final do seu .bashrc que altera o diretório no último diretório que a instância anterior do bash tinha como CWD (diretório de trabalho atual).

Uma linha como esta funcionou para mim:

cd $(readlink  "/proc/$(echo -n $(ps -u $(whoami) -eo stat,pid,cmd | awk '$3 == "'$(which bash)'" && $1 ~ /\+/{print $2}' | sort | head -1))/cwd")

Explicação :

  • cd $(...) : altera o diretório para o que for determinado abaixo
  • readlink /proc/$(...)/cwd : lê o link para o qual /proc/pid/cwd aponta (diretório de trabalho atual)
  • echo -n $(...) : remove a nova linha à direita
  • ps -u $(whoami) -eo stat,pid,cmd : mostra meu processo em um formato simples
  • awk '$3 == "'$(which bash)'" && $1 ~ /\+/{print $2}' se for um bash e bash estiver no grupo de processos em primeiro plano (indicado pelo + no campo stat ), depois imprima o pid
  • sort | head -1 queremos apenas o menor pid

Editar:

No seu caso, essa pode ser uma solução melhor:

cd $(readlink /proc/$(pgrep -n meteor)/cwd)

Ele determina o pid da instância mais recente de meteor e altera para este diretório de trabalho atual.

    
por 17.09.2014 / 16:13
0

Acabei de criar esses aliases (estou usando o bash)

christian@fujiu1404:~$ alias ta='cd tmp ; date'
christian@fujiu1404:~$ ta
Wed Sep 17 14:47:16 BST 2014
christian@fujiu1404:~/tmp$ alias ta='cd tmp && date'
christian@fujiu1404:~/tmp$ cd ..
christian@fujiu1404:~$ ta
Wed Sep 17 14:48:28 BST 2014
christian@fujiu1404:~/tmp$ 

e eles funcionam!

    
por 17.09.2014 / 15:50