/ bin/sh:pushd:找不到

Pei*_*ein 89 linux

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

pushd %dir_name%
Run Code Online (Sandbox Code Playgroud)

我得到以下错误

/bin/sh : pushd : not found
Run Code Online (Sandbox Code Playgroud)

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

sar*_*old 101

pushdbash对POSIX指定的Bourne Shell 的增强.pushd无法轻松实现为命令,因为当前工作目录是子进程无法更改的进程的功能.(一个假设的pushd命令可能会执行chdir(2)调用,然后启动一个新的shell,但是......它不会非常有用.)pushd是一个内置的shell,就像cd.

因此,要么将脚本更改为开头,#!/bin/bash要么将当前工作目录存储在变量中,执行您的工作,然后再进行更改.取决于你是否想要一个可以在非常简化的系统上运行的shell脚本(例如,Debian构建服务器),或者你总是需要它bash.

  • OP表示它是从make运行的.所以它将设置`SHELL =/bin/bash`而不是用`#!/ bin/bash`启动脚本. (13认同)

小智 24

SHELL:=/bin/bash

在makefile的顶部我在另一个问题上找到了它如何在Makefile目标中使用Bash语法?


Cla*_*ied 17

解决方法是让变量获取当前工作目录.然后你可以用它来做任何事情,然后当你需要它时,你可以重新进入.

oldpath=`pwd`
#do whatever your script does
...
...
...
# go back to the dir you wanted to pushd
cd $oldpath

  • 你也可以`cd`到你想要的目录,然后做`cd -`,如果你不在`之间使用`cd`,则不需要使用`$ oldpath`变量.关于`pushd`的有趣之处在于,每次使用它都会将目录推入堆栈,然后你可以使用`popd`返回到最新的目录,因此在进入时使用它是有意义的.不止一个目录,并希望一定回来. (5认同)
  • 如果它只是一个单行代码,则以下内容也可能有效“(cd /new_path ; command)” (3认同)

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;"
Run Code Online (Sandbox Code Playgroud)

运行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>
Run Code Online (Sandbox Code Playgroud)

对于test1,即使将bash用作shell,规则中的每个命令/行都是自己运行的,因此pushd命令在与popd不同的shell中运行.


小智 10

sudo dpkg-reconfigure dash 
Run Code Online (Sandbox Code Playgroud)

然后选择no


Bor*_*ile 8

这应该可以解决问题:

( cd dirname ; pwd ); pwd
Run Code Online (Sandbox Code Playgroud)

括号启动一个新的子 shell,因此cd仅更改子 shell 中的目录,括号内后面的任何命令都将在该文件夹中运行。一旦退出括号,您就会回到之前的位置。


Muh*_*man 7

这是一个指向的方法

sh -> bash

在终端上运行此命令

sudo dpkg-reconfigure dash
Run Code Online (Sandbox Code Playgroud)

之后你应该看到

ls -l /bin/sh
Run Code Online (Sandbox Code Playgroud)

指向 /bin/bash (而不是 /bin/dash)

参考


jos*_*orc 5

您的 shell (/bin/sh) 正在尝试查找“pushd”。但它找不到它,因为 'pushd'、'popd' 和其他类似的命令是在 bash 中构建的。

使用 Bash (/bin/bash) 而不是像你现在所做的那样启动你的脚本,它会起作用