37

我想知道为什么cd在 shell 脚本中不起作用。如下,

#!/bin/sh
cd test
mkdir $(date +%d-%mm-%Y)

当我运行它时,我无法 cd 进行测试

cd: 2: can't cd to /test

为什么会这样?

4

10 回答 10

64

我有同样的问题。原来问题是 \r\n 行尾。

要修复它,请执行

tr -d "\r" < oldname.sh > newname.sh

来自http://talk.maemo.org/showthread.php?s=1cadd53b369d5408c2b9d53580a32dc4&t=67836&page=2

于 2012-07-11T08:21:23.517 回答
10

与这个问题并不真正相关。我有同样的错误信息,但是,我正在使用

cd ~/foo/bar

将其更改为

cd $HOME/foo/bar

它是固定的。

于 2015-05-17T18:54:32.083 回答
4

我有这个问题,并且很困惑一段时间。

事实证明我已经设置了我的$CDPATH环境变量,它通常允许常规cd命令像往常一样工作。但是,我在非交互模式下运行我的脚本,作为“sh”(不是“bash”),其中的行为有点不同。看起来像这样的命令:

cd subdir  # works via interactive bash; not in script run via sh.

即使CDPATH设置了,也会在我的交互式登录 shell bash 中按预期工作。但是,当我在脚本中运行相同的命令(使用sh)时,它失败了

myscript.sh: line 9: cd: subdir: No such file or directory

我将其修改为相对路径:

cd ./subdir

它有效!我相信区别在于外壳如何使用CDPATH. 在一种情况下,它同时搜索CDPATH 您的当前目录,但在脚本中它只搜索CDPATH. 这类似于 的行为PATH。如果您离开.(当前目录)在您的. 之外PATH,那么您必须键入./localbinary而不是仅仅localbinary执行该文件。

这是我有根据的猜测。当我设置/取消设置CDPATH时,它会中断/取消cd subdir命令,并且cd ./subdir在所有情况下都适用于我。

于 2012-09-19T01:45:30.827 回答
3

放在pwd第一行。然后查看该目录是否有测试子目录。

它看起来像是从根目录运行的

于 2011-02-07T05:19:41.797 回答
2

Benito Ciaro的回答是正确的。我只想添加另一种可用于删除 \r\n行尾的方法。在文本编辑器Sublime和菜单中打开脚本

转到视图 → 行尾 → Unix

这将从您的脚本中删除 '\r' 字符。不要忘记保存您的文件。

于 2019-06-16T13:20:27.590 回答
1

好吧,我用“”让它工作了

因此,在您的情况下,它将是:

cd "test"

/马库斯

于 2012-08-19T11:36:00.447 回答
0

这取决于从哪里执行脚本,如果脚本在您的 $PATH 中,那么它将基于您从(工作目录)发出命令的当前目录。

如果这是作为 cron 作业运行的脚本,最好使用完整的目录路径。
示例:
cd /home/user/test

如果脚本在您的 $PATH 中,则提供完整路径也将起作用。

于 2011-02-07T05:20:13.293 回答
0

2是“没有这样的文件或目录”的 errno。您确定脚本test存在于脚本的工作目录中吗?

您可能想先到cd一个已知的“好”目录,然后 cd 到该好目录的已知子目录。

于 2011-02-07T05:20:58.977 回答
0

我在ubuntu中遇到了同样的问题。我的命令外壳是:

$ export DIR=mydir

然后执行一个脚本文件,其中包含:

#!/bin/sh
cd ~/$DIR

给出输出:

cd: 2: can't cd to ~/mydir

通过尝试许多选项,最后只能这样解决:

#!/bin/sh
WORKDIR=~/$DIR
cd "$WORKDIR"
于 2019-06-07T07:12:49.160 回答
-1

确保您在正确的目录中

运行下面的命令知道你在哪里

pwd

Shell 脚本在子shell 中运行,每个子shell 都有自己的当前目录概念。成功了cd,但是一旦子 shell 退出,你就回到了交互式 shell,那里没有任何改变。

尝试这个

. myscript.sh
于 2017-07-24T12:32:18.637 回答