我在make文件中执行以下操作 
pushd %dir_name%
我得到以下错误
/bin/sh : pushd : not found
有人可以告诉我为什么会出现这个错误吗?我检查了我的$ PATH变量,它包含/ bin所以我认为这不会导致问题.
sar*_*old 101
pushd是bash对POSIX指定的Bourne Shell 的增强.pushd无法轻松实现为命令,因为当前工作目录是子进程无法更改的进程的功能.(一个假设的pushd命令可能会执行chdir(2)调用,然后启动一个新的shell,但是......它不会非常有用.)pushd是一个内置的shell,就像cd.
因此,要么将脚本更改为开头,#!/bin/bash要么将当前工作目录存储在变量中,执行您的工作,然后再进行更改.取决于你是否想要一个可以在非常简化的系统上运行的shell脚本(例如,Debian构建服务器),或者你总是需要它bash.
Cla*_*ied 17
解决方法是让变量获取当前工作目录.然后你可以用它来做任何事情,然后当你需要它时,你可以重新进入.
即
oldpath=`pwd` #do whatever your script does ... ... ... # go back to the dir you wanted to pushd cd $oldpath
hlo*_*dal 10
这是因为pushd是bash中的内置函数.因此它与PATH变量无关,而且/ bin/sh也不支持它(默认情况下由make使用.您可以通过设置SHELL来更改它(尽管它不能直接工作(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并生成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中运行.
这应该可以解决问题:
( cd dirname ; pwd ); pwd
括号启动一个新的子 shell,因此cd仅更改子 shell 中的目录,括号内后面的任何命令都将在该文件夹中运行。一旦退出括号,您就会回到之前的位置。
这是一个指向的方法
sh -> bash
在终端上运行此命令
sudo dpkg-reconfigure dash
之后你应该看到
ls -l /bin/sh
指向 /bin/bash (而不是 /bin/dash)
您的 shell (/bin/sh) 正在尝试查找“pushd”。但它找不到它,因为 'pushd'、'popd' 和其他类似的命令是在 bash 中构建的。
使用 Bash (/bin/bash) 而不是像你现在所做的那样启动你的脚本,它会起作用