“cd”在 shell 脚本中不起作用

问题描述 投票:0回答:12

我想知道为什么

cd
在 shell 脚本中不起作用。如下,

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

当我运行这个时,我得到can't cd to test

cd: 2: can't cd to /test

为什么会这样?

linux shell cd
12个回答
78
投票

我也有同样的问题。 原来问题是 行结尾。

要修复它,请执行以下操作

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

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


18
投票

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

cd ~/foo/bar

将其更改为

cd $HOME/foo/bar

已修复。


5
投票

我也遇到过这个问题,一度很困惑。

事实证明,我已经设置了

$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

而且它有效!我相信区别在于 shell 如何使用

CDPATH
。在一种情况下,它会搜索
CDPATH
当前目录,但在脚本中它 搜索
CDPATH
。这与
PATH
的行为类似。如果您将
.
(当前目录)保留在
PATH
之外,那么您必须键入
./localbinary
而不是仅输入
localbinary
才能执行该文件。

这是我有根据的猜测。当我设置/取消设置

CDPATH
时,它会中断/取消中断
cd subdir
命令,并且
cd ./subdir
在所有情况下都适用于我。


4
投票

pwd
作为第一行。 然后查看该目录是否有 test 子目录。

看起来像是从根目录运行


2
投票

Benito Ciaro的回答很到位。我只是想添加另一种方法,您可以使用它来删除

\r\n
行结尾。在文本编辑器 Sublime 和菜单

中打开脚本

转到 查看 → 行结尾 → Unix

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


1
投票

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

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

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


1
投票

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

所以在你的情况下是:

cd "test"

/马库斯


0
投票

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

您可能需要首先

cd
known“好”目录,然后 cd 进入该好目录的 known 子目录。


0
投票

确保您位于正确的目录中

运行以下命令即可知道你在哪里

pwd

Shell 脚本在子 shell 内运行,每个子 shell 对当前目录都有自己的概念。

cd
成功了,但是一旦子 shell 退出,您就会回到交互式 shell,那里什么也没有改变。

试试这个

. myscript.sh

0
投票

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

$ export DIR=mydir

然后执行包含以下内容的脚本文件:

#!/bin/sh
cd ~/$DIR

给出输出:

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

尝试了很多方案,最后只能这样解决:

#!/bin/sh
WORKDIR=~/$DIR
cd "$WORKDIR"

0
投票

我对此不太了解,但我更改了文件夹的权限,它对我有用

chmod -R 775 ubuntu

0
投票

попробуйте создать .sh скрипт через редактор в консоли vim/nano

© www.soinside.com 2019 - 2024. All rights reserved.