Eu quero executar um script para simplesmente alterar o diretório de trabalho atual:
#!/bin/bash
cd web/www/project
Mas, depois de executá-lo, o atual pwd permanece inalterado! Como eu posso fazer isso?
Eu quero executar um script para simplesmente alterar o diretório de trabalho atual:
#!/bin/bash
cd web/www/project
Mas, depois de executá-lo, o atual pwd permanece inalterado! Como eu posso fazer isso?
Respostas:
É um comportamento esperado, e já discutido várias vezes.
O script é executado em uma subshell e não pode alterar o diretório de trabalho do shell pai. Seus efeitos são perdidos quando termina.
Para alterar o diretório permanentemente, você deve originar o script, como em
. ./script
source ./script
o mesmo?
.
e source
são iguais no bash. 2. não precisamos usar o ./
nome do arquivo antes, se estiver no mesmo diretório. Não há problema em executar apenas isso:. script
Para pequenas tarefas como essa, em vez de criar script, crie um alias como este,
$ alias cdproj='cd /dir/web/www/proj'
Você deve adicionar isso ao seu .bashrc
arquivo, se desejar, para cada shell interativo.
Agora você pode executar isso como $ cdproj
.
eval `./script`
ou eval $(./script)
para executar esses comandos. Essa é uma abordagem comum para comandos que precisam atualizar o ambiente do shell de chamada.
eval
abordagem.
exec bash
no finalUm script bash opera em seu ambiente atual ou em seus filhos, mas nunca em seu ambiente pai.
No entanto, essa pergunta geralmente é feita porque alguém deseja ser deixado no prompt do bash em um determinado diretório após a execução de um script bash de outro diretório.
Se for esse o caso, simplesmente execute uma instância do bash filho no final do script:
#!/usr/bin/env bash
cd desired/directory
exec bash
Isso cria um novo subshell. Digite exit
para retornar ao primeiro shell em que o script foi iniciado inicialmente.
exec
é normalmente considerado o último recurso de um canalha .. :) #
exit
(ou Ctrl + D), precisará fazer isso 11 a 21 vezes. (2) Outra desvantagem do uso de um script executável é que, se você definir quaisquer opções de shell (por exemplo, dotglob
ou globstar
) em sua sessão interativa de shell, você as perderá, porque está iniciando um novo shell.
Embora existam respostas que executam a ação exata que você deseja, um método mais padrão para esse fim é criar um link simbólico:
ln -s ~/web/www/project proj #use full path to dir!
Em seguida, você pode cd
acessar o diretório usando o nome proj
:
cd proj
Este método é mais flexível porque você pode acessar arquivos usando o nome abreviado sem cd
:
ls proj/ #note the endslash!
vim proj/file.x
Se você mudar entre diretórios distantes no sistema de arquivos. Vou recomendar o salto automático .
Depende do que você fará, outra solução pode ser criar uma função em vez de um script.
Exemplo:
Crie uma função em um arquivo, digamos /home/aidin/my-cd-script
:
function my-cd() {
cd /to/my/path
}
Em seguida, inclua-o no seu arquivo bashrc
ou zshrc
:
# Somewhere in rc file
source /home/aidin/my-cd-script
Agora você pode usá-lo como um comando:
$ my-cd
Por que não usar "exec" é costurado para fazer exatamente o que eu desejo.
#!/bin/bash
cd someplace
exec bash
~/someplace
exit
(ou Ctrl + D), será necessário fazer isso 11 a 21 vezes.
dotglob
ou globstar
), você as perderá, porque está iniciando um novo shell. … (Continua)
Você pode fazer isso usando uma função ou usando && Os exemplos abaixo instalam o Zabbix e criam um arquivo com uma linha dentro dele.
Ex:
#!/bin/bash
# Create Function:
installZabbix(){
cd /usr/src/zabbix-4.2.4;
./configure --enable-agent;
make install;
cd /usr/src/;
>file;
echo "Hi, this is a file." >>file;
}
# Call the function:
installZabbix
ou:
#!/bin/bash
cd /usr/src/zabbix-4.2.4 && ./configure --enable-agent && make install && cd /usr/src && >file && echo "Hi, this is a file." >>file
return
para escapar de um script originado dessa maneira, nãoexit
- eles são como funções do shell eexit
sairão do shell que originou o script.