我在make文件中执行以下操作
pushd %dir_name%
我得到以下错误
/bin/sh : pushd : not found
有人可以告诉我为什么出现此错误吗?我检查了$ PATH变量,它包含/ bin,所以我不认为这会引起问题。
我在make文件中执行以下操作
pushd %dir_name%
我得到以下错误
/bin/sh : pushd : not found
有人可以告诉我为什么出现此错误吗?我检查了$ PATH变量,它包含/ bin,所以我不认为这会引起问题。
Answers:
pushd
是bash
POSIX指定的Bourne Shell 的增强。pushd
不能轻松地实现为命令,因为当前工作目录是进程的功能,子进程无法更改。(一个假设的pushd
命令可能会执行chdir(2)
调用,然后启动一个新的shell,但是...并不是很有用。)pushd
是一个内置的shell,就像cd
。
因此,更改脚本开头#!/bin/bash
或将当前工作目录存储在变量中,进行工作,然后再更改回去。取决于您是否需要在非常简化的系统(例如Debian构建服务器)上运行的Shell脚本,或者是否总是需要bash
。
SHELL = /bin/bash
而不是使用来启动脚本#!/bin/bash
。
test1
在我的答案,stackoverflow.com/questions/5193048/bin-sh-pushd-not-found/...。
#!/bin/bash
是文件的第一行。
一种解决方法是让变量获取当前的工作目录。然后,您可以使用cd退出以执行任何操作,然后在需要时使用cd返回。
即
oldpath =`pwd` #执行脚本的所有操作 ... ... ... #返回您要推送的目录 cd $ oldpath
cd
进入所需的目录,然后再执行操作cd -
,$oldpath
如果您之间不使用该变量,则无需使用该变量cd
。有趣的pushd
是,每次使用该目录时,您都将目录推送到堆栈中,然后可以使用返回到最新目录popd
,因此,当您要进入多个目录并需要一个目录时,可以使用该目录肯定的方法。
(cd /new_path ; command )
这是因为push是bash中的内置函数。因此,它与PATH变量无关,也不受/ bin / sh支持(make缺省使用它。您可以通过设置SHELL来更改它(尽管它不能直接起作用(test1)))。
您可以改为通过运行所有命令bash -c "..."
。这将使命令(包括push / 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和make test2时,它提供以下内容:
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,即使将bash用作shell,规则中的每个命令/行也都由其自身运行,因此pushd命令在与popd不同的shell中运行。
tcsh
(也许csh
?)确实以以下方式结束了他们的提示>
:$ tcsh haig:/> exit $ csh haig:/> exit $
(\u) \h:\w>
但是我现在将其剥离为通用字符串以获取答案。>
默认情况下,DOS中的提示也以($P$G
IRC)结尾,我喜欢这样。
从其他响应中合成:pushd
是特定于bash的,并且您正在使用另一个POSIX shell。有一个简单的解决方法,对于需要不同目录的零件使用单独的外壳,因此只需尝试将其更改为:
test -z gen || mkdir -p gen \
&& ( cd $(CURRENT_DIRECTORY)/genscript > /dev/null \
&& perl genmakefile.pl \
&& mv Makefile ../gen/ ) \
&& echo "" > $(CURRENT_DIRECTORY)/gen/SvcGenLog
(我将长路径替换为变量扩展。我可能是makefile中的一个,并且显然扩展为当前目录)。
由于您是从make运行的,因此我可能也会用make规则替换测试。只是
gen/SvcGenLog :
mkdir -p gen
cd genscript > /dev/null \
&& perl genmakefile.pl \
&& mv Makefile ../gen/ \
echo "" > gen/SvcGenLog
(删除当前目录前缀;无论如何,您在某些点上都使用了相对路径)并且不仅仅是使规则依赖于gen/SvcGenLog
。它将更具可读性,您也可以依赖它genscript/genmakefile.pl
,因此如果您修改脚本Makefile
,gen
则将重新生成in 。当然,如果其他任何因素影响的内容Makefile
,您也可以使规则也取决于该规则。
这应该可以解决问题:
( cd dirname ; pwd ); pwd
括号会启动一个新的子外壳程序,因此cd
仅更改子目录中的目录,并且括号后的任何命令都将在该文件夹中运行。退出括号后,您将回到之前的位置。
pushd
。被推入你的$PATH
?