/ 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
,所以如果你修改脚本,那么在gen
的Makefile
将被重新生成。 当然,如果其他任何东西影响到Makefile
的内容,也可以使规则依赖于这个。
请注意,由make文件执行的每一行无论如何都在其自己的shell中运行。 如果更改目录,则不会影响后续行。 所以你可能对pushd和popd的用处不大,你的问题更多的是相反的,只要你需要它,让目录保持改变!
你的shell(/ bin / sh)试图find'pushd'。 但它不能find它,因为'pushd','popd'和其他命令是在bash中构build的。
像现在这样使用Bash(/ bin / bash)而不是Sh来启动脚本,它就可以工作