Je fais ce qui suit dans un fichier make
pushd %dir_name%
et j'obtiens l'erreur suivante
/bin/sh : pushd : not found
Quelqu'un peut-il me dire pourquoi cette erreur apparaît? J'ai vérifié ma variable $ PATH et elle contient / bin donc je ne pense pas que cela pose un problème.
pushd
. Est-ce que pushd est dans votre$PATH
?Réponses:
pushd
est unebash
amélioration du Bourne Shell spécifié par POSIX.pushd
ne peut pas être facilement implémenté en tant que commande, car le répertoire de travail actuel est une fonctionnalité d'un processus qui ne peut pas être modifiée par les processus enfants. (Unepushd
commande hypothétique pourrait faire l'chdir(2)
appel et ensuite démarrer un nouveau shell, mais ... ce ne serait pas très utilisable.)pushd
Est un shell intégré, tout commecd
.Donc, changez votre script pour démarrer
#!/bin/bash
ou stockez le répertoire de travail actuel dans une variable, faites votre travail, puis revenez en arrière. Cela dépend si vous voulez un script shell qui fonctionne sur des systèmes très réduits (par exemple, un serveur de construction Debian) ou si vous avez toujours besoin debash
.la source
SHELL = /bin/bash
plutôt que de démarrer le script avec#!/bin/bash
.test1
dans ma réponse, stackoverflow.com/questions/5193048/bin-sh-pushd-not-found/… .#!/bin/bash
s'agit de la première ligne du fichier.ajouter
en haut de votre makefile je l'ai trouvé sur une autre question Comment puis-je utiliser la syntaxe Bash dans les cibles Makefile?
la source
Une solution de contournement pour cela serait d'avoir une variable pour obtenir le répertoire de travail actuel. Ensuite, vous pouvez en sortir un CD pour faire n'importe quoi, puis lorsque vous en avez besoin, vous pouvez le récupérer.
c'est à dire
la source
cd
dans le répertoire que vous voulez et ensuite fairecd -
, pas besoin d'utiliser cette$oldpath
variable si vous n'utilisez pascd
entre les deux. La chose intéressantepushd
est que chaque fois que vous l'utilisez, vous poussez un répertoire dans une pile, et ensuite vous pouvez revenir au dernier en utilisantpopd
, il est donc logique de l'utiliser lorsque vous allez dans plus d'un répertoire et que vous voulez un retour sûr.(cd /new_path ; command )
C'est parce que pushd est une fonction intégrée dans bash. Il n'est donc pas lié à la variable PATH et n'est pas non plus supporté par / bin / sh (qui est utilisé par défaut par make. Vous pouvez changer cela en définissant SHELL (bien que cela ne fonctionnera pas directement (test1)).
Vous pouvez à la place exécuter toutes les commandes via
bash -c "..."
. Cela rendra les commandes, y compris pushd / popd, exécutées dans un environnement bash (test2).Lors de l'exécution de make test1 et make test2, cela donne ce qui suit:
Pour test1, même si bash est utilisé comme shell, chaque commande / ligne de la règle est exécutée par elle-même, donc la commande pushd est exécutée dans un shell différent de popd.
la source
tcsh
(et peutcsh
- être ?)>
$ tcsh haig:/> exit $ csh haig:/> exit $
(\u) \h:\w>
mais je l'ai juste réduite à une chaîne générique maintenant pour la réponse. L'invite sous DOS se termine également par>
par défaut ($P$G
IIRC), et j'aime ça.Votre shell (/ bin / sh) essaie de trouver «pushd». Mais il ne peut pas le trouver car 'pushd', 'popd' et d'autres commandes de ce genre sont construites dans bash.
Lancez votre script en utilisant Bash (/ bin / bash) au lieu de Sh comme vous le faites maintenant, et cela fonctionnera
la source
Puis sélectionnez
no
.la source
Synthétiser à partir des autres réponses:
pushd
est spécifique à bash et vous faites en utilisant un autre shell POSIX. Il existe une solution de contournement simple pour utiliser un shell séparé pour la partie qui nécessite un répertoire différent, alors essayez simplement de le changer en:(J'ai remplacé le long chemin par une extension variable. J'en suis probablement un dans le makefile et il se développe clairement dans le répertoire courant).
Puisque vous l'exécutez à partir de make, je remplacerais probablement le test par une règle make, aussi. Juste
(a supprimé le préfixe de répertoire actuel; vous utilisiez de toute façon un chemin relatif à certains moments) Et que de simplement faire dépendre la règle
gen/SvcGenLog
. Ce serait un peu plus lisible et vous pouvez le faire dépendregenscript/genmakefile.pl
aussi, donc leMakefile
ingen
sera régénéré si vous modifiez le script. Bien sûr, si quelque chose d'autre affecte le contenu deMakefile
, vous pouvez également faire en sorte que la règle en dépende.la source
Notez que chaque ligne exécutée par un fichier make est de toute façon exécutée dans son propre shell. Si vous changez de répertoire, cela n'affectera pas les lignes suivantes. Vous avez donc probablement peu d'utilité pour pushd et popd, votre problème est plutôt l'inverse, celui de faire en sorte que le répertoire reste changé aussi longtemps que vous en avez besoin!
la source
Exécutez "apt install bash". Il installera tout ce dont vous avez besoin et la commande fonctionnera
la source
voici une méthode pour pointer
sh -> bash
exécutez cette commande sur le terminal
Après cela, vous devriez voir
pointez sur / bin / bash (et non sur / bin / dash)
Référence
la source
Cela devrait faire l'affaire:
Les parenthèses démarrent un nouveau shell enfant, donc le
cd
répertoire dans l'enfant uniquement, et toute commande après celui-ci entre parenthèses s'exécutera dans ce dossier. Une fois que vous avez quitté les parenthèses, vous êtes de retour là où vous étiez auparavant.la source