首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >/bin/sh: pushd:未找到

/bin/sh: pushd:未找到
EN

Stack Overflow用户
提问于 2011-03-04 19:20:16
回答 10查看 131K关注 0票数 111

我在make文件中执行以下操作

代码语言:javascript
复制
pushd %dir_name%

我得到了下面的错误

代码语言:javascript
复制
/bin/sh : pushd : not found

有人能告诉我为什么会出现这个错误吗?我检查了我的$PATH变量,它包含/bin,所以我不认为这会导致问题。

EN

回答 10

Stack Overflow用户

发布于 2011-03-04 19:25:35

pushd是对特定于POSIX的Bourne Shell的bash增强。pushd不容易作为命令实现,因为当前工作目录是进程的一个特性,子进程不能更改它。(一个假设的pushd命令可能会执行chdir(2)调用,然后启动一个新的shell,但是...它不是很好用。)和cd一样,pushd也是一个内置外壳。

因此,要么将脚本更改为以#!/bin/bash开头,要么将当前工作目录存储在一个变量中,完成您的工作,然后改回原来的目录。这取决于你是想要一个能在非常精简的系统(比如Debian build server)上工作的shell脚本,还是总是需要bash就可以了。

票数 127
EN

Stack Overflow用户

发布于 2011-05-17 08:08:53

添加

外壳:= /bash/bash

在makefile的顶部,我在另一个问题How can I use Bash syntax in Makefile targets?中找到了它

票数 32
EN

Stack Overflow用户

发布于 2011-03-04 19:26:08

这是因为pushd是bash中的一个内置函数。因此它与PATH变量无关,而且/bin/sh ( make默认使用它)也不支持它。您可以通过设置SHELL来更改它(尽管它不会直接工作(test1))。

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

代码语言:javascript
复制
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时,它提供了以下内容:

代码语言:javascript
复制
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中运行。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5193048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档