alterando o diretório de trabalho atual com um script

7

Li esta pergunta e resposta, mas não se encaixa no meu problema, mesmo que seja semelhante.

Estou escrevendo um script (chamado cpj) que lançará um dos meus projetos atuais. Eu tenho cerca de 5 deles. Quando eu digito

$ cpj blah

Eu quero que o diretório de trabalho atual mude para o diretório do projeto blah (que eu mantenho em $ PROJDIR) e quero que o emacsclient abra o arquivo principal para esse projeto (que eu possuo em $ MAINFILE).

A pergunta que citei diz que não é possível alterar diretamente o ambiente do shell que está executando o script, mas você pode criar um script e ele fará isso.

Para testar isso eu escrevi um script de shell (chamado chcwd) que tem uma linha:

cd $1

Se, na linha de comando, eu fizer isso:

$ . chcwd $PROJDIR

meu diretório de trabalho atual mudará como eu desejo. Se, por outro lado, do meu script cpj, eu tenho a mesma linha:

. chcwd $PROJECT

não irá alterar o diretório de trabalho atual do shell. Eu percebo que estou executando 2 scripts (cpj e, em seguida, chcwd), e assim criando 2 shells, mas não vejo como fazer o que eu quero. Alguém pode me mostrar como realizar meu objetivo?

    
por bev 10.06.2011 / 01:35

3 respostas

11

Você não pode comer o seu bolo também. As duas coisas que estão acontecendo aqui estão executando um script em um novo shell e importando linhas de script para serem executadas no shell atual. Usando o operador dot (que é um alias para o comando source ) você está realmente executando o código no seu shell atual . Se o seu código escolher cd , quando terminar, você será deixado no novo diretório.

Se, por outro lado, você quiser executar um programa (ou script, não importa), esse programa será iniciado como um subprocesso. No caso de scripts de shell, um novo shell será aberto e o código será executado dentro dele. Qualquer cd de ação efetuada alterará o diretório de trabalho atual desse shell, eficaz para qualquer comando a ser seguido. Quando o trabalho terminar, o shell sairá, deixando-o de volta no seu shell original (e não modificado).

Se é algo que você usa muito e quer que seus efeitos sejam deixados para trás em seu shell atual, talvez você possa escrever seu "script" como uma função shell e salvá-lo em seu ~ / .profile ou outro shell rc arquivo.

function cpj() {
    # code here
    cd /path/$1
    emacs file_name
}
    
por 10.06.2011 / 01:46
2

Eu tenho um script semelhante escrito para meu uso pessoal. Existe um truque muito fácil para conseguir mudar o diretório de trabalho dentro de um script. Primeiro, basta escrever seu script, em inglês:

#!/bin/bash

case $1 in
     project1) cd /home/me/work/customer1/project1
     ;;
     project2) cd /home/me/work/customer2/project1
     ;;
     project3) cd /home/me/work/customer3/project2
     ;;
     project4) cd /home/me/work/customer4/project5
     ;;
     *) echo "Usage: cdto cd_profile_name"
     ;;
esac

Agora vamos supor que o script é chamado de 'cdto'. Para fazê-lo funcionar, você tem que obtê-lo no shell atual, o que pode ser obtido por 'source' ou '.' comando (ambos são os mesmos). Por exemplo:

. cdto project1

Agora, para torná-lo mais conveniente:

  1. Copie o script 'cdto' para um diretório 'bin' da sua conta (no ex. / home / johnsmith / bin - crie-o se não existir). Verifique sua variável PATH para garantir que o diretório 'bin' esteja incluído:

    echo $ PATH

Se não, edite seu arquivo .profile e adicione:

if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi
  1. Adicione um alias ao seu arquivo .bashrc ou .bash_aliases:

    alias cdto = '. cdto '

E está feito. Após o próximo login ou quando você abrir um novo terminal, você poderá usar o in.ex .:

cdto project1

Aproveite: -)

Sebastian Piech

    
por 19.09.2014 / 12:23
0

Um truque simples para fazer isso:

pushd $PROJDIR && bash

Agora o diretório de trabalho é $ PROJECT.

    
por 25.05.2018 / 05:38