alterando o diretório de trabalho atual com um script


8

Eu li esta pergunta e resposta, mas ela 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 digito

$ cpj blah

Quero que o diretório de trabalho atual mude para o diretório do projeto blah (que eu tenho em $ PROJDIR) e quero que o emacsclient abra o arquivo principal desse projeto (que eu tenho em $ MAINFILE).

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

Para testar isso, escrevi um shell script (chamado chcwd) que possui uma linha:

cd $1

Se, na linha de comando, eu faço:

$ . chcwd $PROJDIR

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

. chcwd $PROJECT

não mudará o diretório de trabalho atual do shell. Percebo que estou executando 2 scripts (cpj e depois chcwd) e, portanto, criando 2 shells, mas não vejo como fazer o que quero. Alguém pode me mostrar como realizar meu objetivo?

Respostas:


11

Você não pode comer seu bolo e 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 de ponto (que é um apelido para o sourcecomando), 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ê deseja 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 executado dentro dele. Qualquer cdação tomada alterará o diretório de trabalho atual para esse shell, efetivo para qualquer comando a seguir. Quando o trabalho terminar, o shell sairá, deixando você de volta no shell original (e não modificado).

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

function cpj() {
    # code here
    cd /path/$1
    emacs file_name
}

Caleb, thx pela sua entrada. Eu gosto do seu trocadilho. Seu primeiro parágrafo reafirma admiravelmente o que eu disse em minha pergunta. O seu segundo parágrafo reafirma o que foi dito na pergunta que citei muito bem. Seu terceiro parágrafo é exatamente e precisamente o que eu estava procurando! Valeu cara.
Bev

2

Eu tenho um script semelhante escrito para meu uso pessoal. Existe um truque muito fácil de conseguir alterar o diretório de trabalho dentro de um script. Primeiro, basta escrever seu script, in.ex .:

#!/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 assumir que o script é chamado 'cdto'. Para fazê-lo funcionar, você deve obtê-lo no shell atual, o que pode ser alcançado por 'source' ou '.' comando (ambos são iguais). Ex .:

. cdto project1

Agora, para torná-lo mais conveniente:

  1. Copie o script 'cdto' para um diretório 'bin' da sua conta (em. 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:

    eco $ PATH

Caso contrário, 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ê abre um novo terminal, você pode apenas usar in.ex .:

cdto project1

Desfrutar :-)

Sebastian Piech


0

Um truque simples para fazer isso:

pushd $PROJDIR && bash

Agora, o diretório de trabalho é $ PROJECT.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.