Estou fazendo o seguinte dentro de um arquivo make
pushd %dir_name%
e eu recebo o seguinte erro
/bin/sh : pushd : not found
Alguém pode me dizer por que esse erro está aparecendo? Eu verifiquei minha variável $ PATH e ela contém / bin, então não acho que isso esteja causando um problema.
pushd
. O pushd está no seu$PATH
?Respostas:
pushd
é umbash
aprimoramento do Bourne Shell especificado por POSIX.pushd
não pode ser facilmente implementado como um comando, porque o diretório de trabalho atual é um recurso de um processo que não pode ser alterado por processos filho. (Umpushd
comando hipotético pode fazer achdir(2)
chamada e, em seguida, iniciar um novo shell, mas ... não seria muito utilizável.)pushd
É um shell embutido, assim comocd
.Portanto, altere seu script para começar
#!/bin/bash
ou armazene o diretório de trabalho atual em uma variável, faça seu trabalho e depois volte. Depende se você deseja um script de shell que funcione em sistemas muito reduzidos (digamos, um servidor de compilação Debian) ou se você está sempre bem solicitandobash
.fonte
SHELL = /bin/bash
vez de iniciar o script com#!/bin/bash
.test1
em minha resposta, stackoverflow.com/questions/5193048/bin-sh-pushd-not-found/… .#!/bin/bash
seja a primeira linha do arquivo.adicionar
no topo do seu makefile eu encontrei em outra questão Como posso usar a sintaxe Bash nos destinos do Makefile?
fonte
Uma solução alternativa para isso seria fazer com que uma variável obtivesse o diretório de trabalho atual. Depois, você pode usar o cd para fazer o que quiser e, quando precisar, pode fazer o cd de volta.
ie
fonte
cd
entrar no diretório que quiser e depois fazercd -
, não há necessidade de usar essa$oldpath
variável se você não usar nocd
meio. O interessantepushd
é que cada vez que você o usa, você empurra um diretório para uma pilha e, depois disso, pode voltar ao último usandopopd
, por isso faz sentido usá-lo quando estiver entrando em mais de um diretório e quiser um caminho de volta seguro.(cd /new_path ; command )
Isso ocorre porque pushd é uma função embutida no bash. Portanto, não está relacionado à variável PATH e também não é suportado por / bin / sh (que é usado por padrão pelo make. Você pode mudar isso configurando SHELL (embora não funcione diretamente (test1)).
Em vez disso, você pode executar todos os comandos
bash -c "..."
. Isso fará com que os comandos, incluindo pushd / popd, sejam executados em um ambiente bash (test2).Ao executar make test1 e make test2, ele fornece o seguinte:
Para test1, embora o bash seja usado como um shell, cada linha de comando / linha na regra é executada por si só, portanto, o comando pushd é executado em um shell diferente do popd.
fonte
tcsh
(e talvezcsh
?)>
$ tcsh haig:/> exit $ csh haig:/> exit $
(\u) \h:\w>
mas eu apenas o reduzi a uma string genérica agora para a resposta. O prompt no DOS também termina com>
por padrão ($P$G
IIRC), e eu gosto disso.Seu shell (/ bin / sh) está tentando encontrar 'pushd'. Mas ele não consegue encontrar porque 'pushd', 'popd' e outros comandos como esse são compilados no bash.
Lance seu script usando Bash (/ bin / bash) em vez de Sh como você está fazendo agora, e vai funcionar
fonte
Em seguida, selecione
no
.fonte
Sintetizando a partir de outras respostas:
pushd
é específico do bash e você está usando outro shell POSIX. Há uma solução simples para usar um shell separado para a parte que precisa de um diretório diferente, então tente alterá-lo para:(Substituí o caminho longo por uma expansão variável. Provavelmente estou no makefile e ele claramente se expande para o diretório atual).
Já que você o está executando a partir do make, provavelmente também substituiria o teste por uma regra do make. Somente
(eliminou o prefixo do diretório atual; você estava usando o caminho relativo em alguns pontos de qualquer maneira) E então apenas faça a regra depender
gen/SvcGenLog
. Seria um pouco mais legível e você pode torná-lo dependente dogenscript/genmakefile.pl
também, então oMakefile
ingen
será regenerado se você modificar o script. Obviamente, se alguma coisa afetar o conteúdo doMakefile
, você também pode fazer a regra depender disso.fonte
Observe que cada linha executada por um arquivo make é executada em seu próprio shell de qualquer maneira. Se você mudar de diretório, isso não afetará as linhas subsequentes. Portanto, você provavelmente usa pouco pushd e popd, seu problema é mais o oposto, é fazer com que o diretório permaneça alterado pelo tempo que você precisar!
fonte
Execute "apt install bash" Irá instalar tudo o que precisa e o comando irá funcionar
fonte
aqui está um método para apontar
sh -> bash
execute este comando no terminal
Depois disso você deve ver
aponte para / bin / bash (e não para / bin / dash)
Referência
fonte
Isso deve resolver o problema:
Os parênteses iniciam um novo shell filho, portanto,
cd
o diretório muda apenas dentro do filho, e qualquer comando após ele entre os parênteses será executado nessa pasta. Depois de sair dos parênteses, você está de volta onde estava antes.fonte