Eu quero escrever algum código para permitir que eu mude para alguns diretórios aos quais costumo ir. Digamos que este programa seja mycd
e /a/very/long/path/name
é o diretório que eu quero acessar.
Então eu posso simplesmente digitar em mycd 2
vez de cd /a/very/long/path/name
. Aqui, eu suponho mycd
que 2
se refere a isso /a/very/long/path/name
. Também pode haver mycd 1
, mycd 3
... etc.
O problema é que eu tenho que escrever mycd
como um script de shell e digitar . mycd 2
para fazer a coisa desejada, porque, caso contrário, o script será executado em um script filho que não muda nada no shell pai com o qual realmente me importo.
Minha pergunta é:
posso fazer isso sem usar
source
? porque. mycd
assumemycd
que deve ser um script de shell e isso também pode introduzir algumas funções que eu não quero.posso implementá-lo em outras linguagens de programação?
fonte
mycd
passar$@
para qualquer programa que eu goste."$@"
para que todos os argumentos que contenham espaços em branco sejam manipulados corretamente.Você não pode alterar o diretório atual de um shell de outro processo. Somente o próprio processo pode alterar seu próprio diretório atual. Isso também vale para algumas outras características, como variáveis de ambiente e descritores de arquivo.
Na verdade, é possível afetar o diretório atual de outro processo, fazendo com que ele execute uma
chdir
chamada doptrace
sistema por meio da chamada do sistema, que é o que permite que os depuradores funcionem. No entanto, se o processo mantiver algumas estruturas de dados internas que precisam ser consistentes com o diretório atual atual, é provável que o programa trava. Para um shell, essa abordagem não tem chance de funcionar.Você precisa providenciar para que seu código seja executado pelo próprio shell. A maneira normal de proceder seria torná-lo uma função shell e armazená-lo no seu
~/.bashrc
. Se isso não for possível, por exemplo, porque é o código que você deseja distribuir, escrever um arquivo de origem concha que contém a definição da função, e dizer às pessoas para ter seu shell interativo ler o seu arquivo com o.
comando .fonte
ws=$1; gdb -p $(ps h -o ppid -p $$) -ex "call chdir(\"$wd\")" -ex "call set_working_directory(\"$wd\")" -ex detach -ex q -batch
. Executar comobraindead-cd-parent /
. Você verá que ospwd
retornos, o/
mesmo acontecels
, etc. se comportam. Mas o prompt (PS1
) ainda permanece inalterado, os olhos das pessoas estão magoados, etc. Portanto, não faça isso, mesmo que seja possível.ptrace
método que mencionei. Funciona bem em programas que não se importam muito com o diretório atual. Em um shell, muitas coisas (PWD
variáveis, prompt etc.) vão ficar erradas, e o shell pode travar ou se comportar mal.Como você mesmo apontou, os scripts de shell são sempre executados em um subshell, o que não pode influenciar seu shell pai.
Você pode, no entanto ...
alias mycd2='cd /a/very/long/path/name'
faça com que seu script 1 produza um comando shell válido ...
... e execute sua saída:
$(mycd 2)
1: você provavelmente desejará usar uma
case
instrução em vez daif
condição no exemplo.fonte