我想知道为什么cd
在 shell 脚本中不起作用。如下,
#!/bin/sh
cd test
mkdir $(date +%d-%mm-%Y)
当我运行它时,我无法 cd 进行测试
cd: 2: can't cd to /test
为什么会这样?
我有同样的问题。原来问题是 \r\n 行尾。
要修复它,请执行
tr -d "\r" < oldname.sh > newname.sh
来自http://talk.maemo.org/showthread.php?s=1cadd53b369d5408c2b9d53580a32dc4&t=67836&page=2
与这个问题并不真正相关。我有同样的错误信息,但是,我正在使用
cd ~/foo/bar
将其更改为
cd $HOME/foo/bar
它是固定的。
我有这个问题,并且很困惑一段时间。
事实证明我已经设置了我的$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
在所有情况下都适用于我。
放在pwd
第一行。然后查看该目录是否有测试子目录。
它看起来像是从根目录运行的
Benito Ciaro的回答是正确的。我只想添加另一种可用于删除 \r\n
行尾的方法。在文本编辑器Sublime和菜单中打开脚本
转到视图 → 行尾 → Unix
这将从您的脚本中删除 '\r' 字符。不要忘记保存您的文件。
好吧,我用“”让它工作了
因此,在您的情况下,它将是:
cd "test"
/马库斯
这取决于从哪里执行脚本,如果脚本在您的 $PATH 中,那么它将基于您从(工作目录)发出命令的当前目录。
如果这是作为 cron 作业运行的脚本,最好使用完整的目录路径。
示例:
cd /home/user/test
如果脚本在您的 $PATH 中,则提供完整路径也将起作用。
2
是“没有这样的文件或目录”的 errno。您确定脚本test
存在于脚本的工作目录中吗?
您可能想先到cd
一个已知的“好”目录,然后 cd 到该好目录的已知子目录。
我在ubuntu中遇到了同样的问题。我的命令外壳是:
$ export DIR=mydir
然后执行一个脚本文件,其中包含:
#!/bin/sh
cd ~/$DIR
给出输出:
cd: 2: can't cd to ~/mydir
通过尝试许多选项,最后只能这样解决:
#!/bin/sh
WORKDIR=~/$DIR
cd "$WORKDIR"
确保您在正确的目录中
运行下面的命令知道你在哪里
pwd
Shell 脚本在子shell 中运行,每个子shell 都有自己的当前目录概念。成功了cd
,但是一旦子 shell 退出,你就回到了交互式 shell,那里没有任何改变。
尝试这个
. myscript.sh