/ bin / sh:pushd:找不到

我正在做一个make文件中的以下内容

pushd %dir_name% 

我得到以下错误

 /bin/sh : pushd : not found 

有人可以告诉我为什么这个错误显示出来吗? 我检查了我的$ PATHvariables,它包含/ bin,所以我不认为这是造成问题。

pushd是对POSIX指定的Bourne Shell的bash增强。 pushd不能轻易地作为一个命令来实现,因为当前工作目录是subprocess无法更改的进程的一个特性。 (一个假想的pushd命令可能会执行chdir(2)调用,然后启动一个新的shell,但是…它不会很好用。) pushd是一个内置的shell,就像cd一样。

因此,要么将shell改为#!/bin/bash要么将当前工作目录存放在一个variables中,做好你的工作,然后再改回来。 取决于你是否需要一个可以在非常简化的系统上工作的shell脚本(比如Debian构build服务器),或者你总是需要bash

SHELL:= / bin / bash

在你的makefile的顶部,我已经在另一个问题上find了它如何在Makefile目标中使用Bash语法?

解决这个问题的方法是让variables获取当前的工作目录。 然后你可以将它从CD中取出来做任何事情,然后当你需要的时候,你可以重新进入CD。

 oldpath =`pwd`
 #无论你的脚本做什么
 ...
 ...
 ...
 #回到你想推的目录
 cd $ oldpath

这是因为pushd是bash中的一个内置函数。 所以它与PATHvariables无关,也不受/ bin / sh的支持(默认情况下由make使用,你可以通过设置SHELL来改变它(尽pipe它不会直接工作(test1))。

你可以通过bash -c "..."来运行所有的命令。 这将使包括pushd / popd的命令在bash环境(test2)中运行。

 SHELL = /bin/bash test1: @echo before @pwd @pushd /tmp @echo in /tmp @pwd @popd @echo after @pwd test2: @/bin/bash -c "echo before;\ pwd; \ pushd /tmp; \ echo in /tmp; \ pwd; \ popd; \ echo after; \ pwd;" 

在运行make test1和make2时,它给出了以下内容:

 prompt>make test1 before /download/2011/03_mar make: pushd: Command not found make: *** [test1] Error 127 prompt>make test2 before /download/2011/03_mar /tmp /download/2011/03_mar in /tmp /tmp /download/2011/03_mar after /download/2011/03_mar prompt> 

对于test1,尽pipebash被用作shell,但是规则中的每个命令/行都是由它自己运行的,所以pushd命令运行在与popd不同的shell中。

从其他响应合成: pushd是特定于bash的,而您正在使用另一个POSIX shell。 对于需要不同目录的部分使用单独的shell有一个简单的解决方法,所以只需将其更改为:

 test -z gen || mkdir -p gen \ && ( cd $(CURRENT_DIRECTORY)/genscript > /dev/null \ && perl genmakefile.pl \ && mv Makefile ../gen/ ) \ && echo "" > $(CURRENT_DIRECTORY)/gen/SvcGenLog 

(我用一个variables扩展replace了长path,我可能是makefile中的一个,它显然扩展到当前目录)。

既然你正在运行它,我可能会用make规则replacetesting。 只是

 gen/SvcGenLog : mkdir -p gen cd genscript > /dev/null \ && perl genmakefile.pl \ && mv Makefile ../gen/ \ echo "" > gen/SvcGenLog 

(放弃当前的目录前缀;反正你在某些地方使用了相对path)而不是只依赖gen/SvcGenLog 。 它会更可读,你也可以使它依赖于genscript/genmakefile.pl ,所以如果你修改脚本,那么在genMakefile将被重新生成。 当然,如果其他任何东西影响到Makefile的内容,也可以使规则依赖于这个。

请注意,由make文件执行的每一行无论如何都在其自己的shell中运行。 如果更改目录,则不会影响后续行。 所以你可能对pushd和popd的用处不大,你的问题更多的是相反的,只要你需要它,让目录保持改变!

你的shell(/ bin / sh)试图find'pushd'。 但它不能find它,因为'pushd','popd'和其他命令是在bash中构build的。

像现在这样使用Bash(/ bin / bash)而不是Sh来启动脚本,它就可以工作