Estou tentando escrever um pequeno script para alterar o diretório atual para o diretório do meu projeto:
#!/bin/bash
cd /home/tree/projects/java
Salvei este arquivo como proj, adicionei permissão de execução chmod
e copiei-o para /usr/bin
. Quando eu chamo por
proj
:, não faz nada. O que estou fazendo errado?
pwd
na última linha. Portanto, antes de terminar roteiro, então você pode verificar é trabalhar ou não ..cd
comando funciona bem dentro de scripts, tente você mesmo.cd
localizado?Respostas:
Os scripts de shell são executados dentro de um subshell, e cada subshell tem seu próprio conceito de qual é o diretório atual. O resultado
cd
é bem-sucedido, mas assim que o subshell sai, você volta ao shell interativo e nada muda lá.Uma maneira de contornar isso é usar um alias:
fonte
. my-script
orsource my-script
.Você não está fazendo nada errado! Você alterou o diretório, mas apenas dentro do subshell que executa o script.
Você pode executar o script no seu processo atual com o comando "ponto":
Mas eu prefiro a sugestão de Greg de usar um pseudônimo neste caso simples.
fonte
.
também estiver escritosource
, escolha o que achar mais memorável.O
cd
em seu script tecnicamente trabalhou como ele mudou o diretório do shell que executou o script, mas isso foi um processo separado bifurcada do seu shell interativo.Uma maneira compatível com Posix para resolver esse problema é definir um procedimento de shell em vez de um script de comando invocado por shell .
Você pode digitar ou colocar em um dos vários arquivos de inicialização do shell.
fonte
jhome(){ cd /home/tree/projects/$1; }
Isso
cd
é feito dentro do shell do script. Quando o script termina, esse shell sai e você é deixado no diretório em que estava. "Origem" do script, não o execute. Ao invés de:Faz
(Observe o ponto e o espaço antes do nome do script.)
fonte
source
myscript.sh
estiver em um diretório incluído no $ PATH, você poderá obtê-lo de qualquer lugar sem especificar o caminho completo.Para criar um script bash que fará o cd para um diretório selecionado:
Crie o arquivo de script
Em seguida, crie um alias no seu arquivo de inicialização.
Por exemplo, crie um arquivo de aliases / funções mestre: /scripts/mastercode.sh
(coloque o alias neste arquivo.)
Em seguida, no final do seu arquivo .bashrc :
Agora é fácil fazer o cd no diretório java, basta digitar cdjava e você estará lá.
fonte
mastercode.sh
não precisa do shabang (#!/bin/sh
), pois não é (e não pode ser) executado em um subshell. Mas, ao mesmo tempo, você precisa documentar o "sabor" do shell desse arquivo; por exemplo, ksh ou bash (ou (t) csh / zsh, etc), e quase certamente não é realmentesh
. Eu costumo adicionar um comentário (mas não o shebang) para comunicar isso; por exemplo, "este arquivo deve ser originado (do bash), não executado como um script de shell".source
d (via thealias
), essas variáveis vazarão no seu ambiente de shell. Para evitar isso, faça todo o trabalho do script em uma função e chame-o no final do script. Dentro da função, declare quaisquer variáveislocal
.Você pode usar
.
para executar um script no ambiente atual do shell:ou, alternativamente, seu alias mais legível, mas específico do shell
source
:Isso evita o subshell e permite que quaisquer variáveis ou componentes internos (inclusive
cd
) afetem o shell atual.fonte
A idéia de Jeremy Ruten de usar um link simbólico desencadeou um pensamento que não passou por nenhuma outra resposta. Usar:
O cólon principal é importante; significa que, se houver um diretório 'dir' no diretório atual, '
cd dir
' será alterado para isso, em vez de sair para outro lugar. Com o valor definido como mostrado, você pode:e, se não houver um subdiretório chamado java no diretório atual, ele o levará diretamente para $ HOME / projects / java - sem alias, sem scripts, sem executivos duvidosos ou comandos de ponto.
Meu $ HOME é / Users / jleffler; meu $ CDPATH é:
fonte
Use
exec bash
no finalNo entanto, essa pergunta geralmente é feita porque alguém deseja ser deixado em um (novo) 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, basta executar uma instância do bash filho no final do script:
fonte
exit
você retornará ao shell em que executou esse script.Eu tenho meu código para trabalhar usando
. <your file name>
./<your file name>
Dose não funciona porque não altera seu diretório no terminal, apenas altera o diretório específico para esse script.Aqui está o meu programa
Aqui está o meu terminal
fonte
. something
e./something
?? Essa resposta funcionou para mim e não entendo o porquê.. something
permite-lhe executar o roteiro de qualquer lugar,./something
exige que você para estar no diretório do arquivo é armazenado no.#!. /bin/bash
?basta executar:
fonte
Quando você aciona um script de shell, ele executa uma nova instância desse shell (
/bin/bash
). Assim, seu script apenas dispara um shell, altera o diretório e sai. Emcd
outras palavras , (e outros comandos desse tipo) em um script de shell não afetam nem têm acesso ao shell a partir do qual foram iniciados.fonte
No meu caso particular, eu precisei muitas vezes para alterar para o mesmo diretório. Então, no meu .bashrc (eu uso o ubuntu), adicionei o
1 -
2-
3 -
Diretamente ele fará: cd / home / tree / projects / java
Espero que ajude!
fonte
Você pode fazer o seguinte:
EDIT: Isso também pode ser 'pontilhado', para impedir a criação de shells subsequentes.
Exemplo:
fonte
exit
(ou ctrl + d) várias vezes para sair do shell, por exemplo. Um alias é muito mais limpo (mesmo que o comando shell produza um diretório e ele para a saída - alias something = "cdgetnewdirectory.sh
")Ele altera apenas o diretório do próprio script, enquanto o diretório atual permanece o mesmo.
Você pode usar um link simbólico . Ele permite que você faça um "atalho" para um arquivo ou diretório, então você só precisa digitar algo parecido
cd my-project
.fonte
Você pode combinar o alias de Adam & Greg e as abordagens de pontos para criar algo que possa ser mais dinâmico.
Agora, a execução do alias do projeto executará o script do projeto no shell atual, em oposição ao subshell.
fonte
Você pode combinar um alias e um script,
desde que o script faça eco no caminho de destino. Observe que esses são backticks que cercam o nome do script.
Por exemplo, seu script pode ser
A vantagem dessa técnica é que o script pode pegar qualquer número de parâmetros de linha de comando e emitir destinos diferentes calculados por uma lógica possivelmente complexa.
fonte
proj() { cd "/home/user/projects/java/$1"; }
=>proj "foo"
(ou,proj "foo bar"
<= no caso de você ter espaços) ... ou até mesmo (por exemplo):proj() { cd "/home/user/projects/java/$1"; shift; for d; do cd "$d"; done; }
=>proj a b c
=> faz umcd
into/home/user/projects/java/a/b/c
para navegar pelos diretórios rapidamente, existem $ CDPATH, cdargs e maneiras de gerar aliases automaticamente
http://jackndempsey.blogspot.com/2008/07/cdargs.html
http://muness.blogspot.com/2008/06/lazy-bash-cd-aliaes.html
https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-5827311.html
fonte
No seu arquivo ~ / .bash_profile. adicione a próxima função
Reinicie o terminal e você pode digitar
e você será movido para a pasta de destino.
fonte
Você pode usar o operador &&:
cd myDirectory && ls
fonte
&&
se desejar que o segundo seja condicional no primeiro, ou apenas com;
ou nova linha entre eles), mas colocar isso em um script o levará de volta a "por que o shell pai não usa" o novo diretório quando ocd
foi realmente bem-sucedido? "Embora a fonte do script que você deseja executar seja uma solução, você deve estar ciente de que esse script pode modificar diretamente o ambiente do seu shell atual. Também não é mais possível passar argumentos.
Outra maneira de fazer isso é implementar seu script como uma função no bash.
Essa técnica é usada pelo autojump: http://github.com/joelthelion/autojump/wiki para fornecer a você os indicadores de diretório de shell de aprendizado.
fonte
Você pode criar uma função como abaixo na sua
.bash_profile
e ela funcionará sem problemas.A função a seguir aceita um parâmetro opcional que é um projeto. Por exemplo, você pode simplesmente executar
ou
Aqui está a definição da função.
Não se esqueça de adquirir seu
.bash_profile
fonte
Isso deve fazer o que você quiser. Vá para o diretório de interesse (de dentro do script) e crie um novo shell bash.
Se você executar isso, ele o levará ao diretório de interesse e, quando você o sair, o levará de volta ao local original.
Isso levará você a voltar ao diretório original quando sair ( CTRL+ d)
fonte
LOOOOOng depois, mas fiz o seguinte:
crie um arquivo chamado case
cole o seguinte no arquivo:
salve-o e depois:
Eu também criei um alias no meu
.bashrc
:agora quando digito:
essencialmente eu estou digitando:
Você pode digitar qualquer pasta após 'case':
que é como digitar:
respectivamente
No meu caso, o caminho é muito mais longo - esses caras resumiram o ~ info anteriormente.
fonte
cd
no alias é supérfluo e deselegante; o apelido deve simplesmente '. ~ / case`. Tambémcase
é uma palavra-chave reservada, portanto, uma escolha bastante ruim para um nome.Você não precisa de script, apenas defina a opção correta e crie uma variável de ambiente.
no seu
~/.bashrc
permite aocd
conteúdo de variáveis de ambiente.Crie uma variável de ambiente:
e você pode usar:
Outras alternativas .
fonte
Se você estiver usando peixe como casca, a melhor solução é criar uma função. Como exemplo, dada a pergunta original, você pode copiar as 4 linhas abaixo e colá-las na linha de comando do peixe:
Isso criará a função e a salvará para uso posterior. Se o seu projeto mudar, basta repetir o processo usando o novo caminho.
Se preferir, você pode adicionar manualmente o arquivo de função, fazendo o seguinte:
e digite o texto:
e, finalmente, pressione ctrl + x para sair ey seguido de return para salvar suas alterações.
( NOTA: o primeiro método de usar o funcsave cria o arquivo proj.fish para você ).
fonte
Eu tenho um script bash simples chamado p para gerenciar a alteração de diretório no
github.com/godzilla/bash-stuff,
basta colocar o script no diretório bin local (/ usr / local / bin)
e colocar
no seu .bashrc
fonte
Observe a discussão Como faço para definir o diretório de trabalho do processo pai?
Ele contém algumas respostas hackish, por exemplo, https://stackoverflow.com/a/2375174/755804 (alterando o diretório do processo pai via gdb, não faça isso) e https://stackoverflow.com/a/51985735/755804 ( o comando
tailcd
que injeta cd dirname no fluxo de entrada do processo pai; bem, idealmente, ele deve fazer parte do bash e não um hack)fonte
É uma pergunta antiga, mas estou realmente surpreso por não ver esse truque aqui
Em vez de usar cd, você pode usar
Não há necessidade de criar subshells ou usar aliases.
Observe que é sua responsabilidade garantir que o / path / you / want exista.
fonte
Conforme explicado nas outras respostas, você alterou o diretório, mas apenas dentro do sub-shell que executa o script . isso não afeta o shell pai.
Uma solução é usar funções bash em vez de um script bash (
sh
); colocando seu código de script bash em uma função. Isso torna a função disponível como um comando e, em seguida, isso é executado sem um processo filho e, portanto, qualquercd
comando afeta o shell do chamador.Funções do Bash:
Um recurso do perfil bash é armazenar funções personalizadas que podem ser executadas no terminal ou em scripts bash da mesma maneira que você executa aplicativos / comandos. Isso também pode ser usado como um atalho para comandos longos.
Para tornar seu sistema eficiente de funções amplamente, você precisará copiar sua função no final de vários arquivos
Você pode
sudo kwrite /home/user/.bashrc /home/user/.bash_profile /root/.bashrc /root/.bash_profile
editar / criar esses arquivos rapidamenteComo :
Copie o código do seu script bash dentro de uma nova função no final do arquivo de perfil do bash e reinicie o terminal. Depois, você pode executar
cdd
ou qualquer que seja a função que você escreveu.Exemplo de script
Fazendo atalho para
cd ..
comcdd
ls atalho
ls atalho
fonte
Você pode executar algumas linhas no mesmo subshell se terminar as linhas com barra invertida.
fonte