即使路径正确,shell 脚本 cd 也会失败

Posted

技术标签:

【中文标题】即使路径正确,shell 脚本 cd 也会失败【英文标题】:shell script cd fails even though the path is correct 【发布时间】:2011-10-04 13:55:39 【问题描述】:

我需要编写一个脚本来提取指定位置的 tar。

我做了一些简单的事情,比如:

cp test.tar /var/www/html
cd /var/www/html
tar xvf test.tar

如果我手动执行命令一切正常。如果我将它们保存在 .sh 中然后使用 #bash script.sh,我会收到以下错误“:不是目录 cd:/var/www/html”。知道为什么吗?

你的时间。

注意:我在虚拟机(CentOS 5.5)上尝试了脚本版本,脚本运行良好,问题出现在我想使用它的真机上(我使用相同的 OS 磁盘映像,配置与虚拟机...这对我来说真的很奇怪)。

补充:我也尝试调用类似 service mysqld start... 这也失败了,说一个目录不存在(如果我手动运行它仍然有效。)。

【问题讨论】:

如果 'html' 不存在,复制命令会将你的 test.tar 重命名为 'html'。确保它实际上是一个目录,而不是文件的副本。 您是否有机会以其他用户身份运行脚本?尝试在脚本顶部添加“whoami”和“ls -la /var/www”,并将它们提供的输出与直接从命令行运行它们时得到的输出进行比较。 我解决了这个问题(任何人都可以添加这个作为答案吗? - 这很有趣)。我在使用 centos 操作系统的 Windows 上运行的虚拟机上创建了脚本,Windows 中的输入是“\r\n”,而 linux 中的输入是“\n”。该脚本在 vm 上工作,因为 enter 的代码是正确的,而在第二台计算机上,使用本机 linux 它是不正确的。我在 linux 上创建了完全相同的脚本,一切都恢复正常;)。注意... mkdir 部分有效,因为我使用了另一个在 linux 上编写的简化脚本。 【参考方案1】:

看起来您的 cp 可能正在将 test.jar 复制到 www 目录下的 file html。在尝试 cp 之前,请确保 html 存在并且是一个目录。

mkdir -p /var/www/html
cp test.tar /var/www/html
cd /var/www/html
tar xvf test.tar

【讨论】:

cd 给出该错误消息的唯一方法是目标不是目录 脚本好像创建了一个叫html的文件? (甚至认为 html 存在)并试图复制它......这解决了一半的问题(下半部分更新)【参考方案2】:

我解决了这个问题——这很有趣)。

我在使用centos os 的windows 上运行的虚拟机上创建了脚本,windows 中的输入是“\r\n”,而linux 中的输入是“\n”。

该脚本在 vm 上运行,因为 enter 的代码是正确的,而在第二台计算机上,使用本机 linux,它是不正确的。我在 linux 上创建了完全相同的脚本,一切都恢复正常;)。

注意... mkdir 部分有效,因为我使用了另一个在 linux 上编写的简化脚本。

【讨论】:

【参考方案3】:

在相关说明中,我发现“~”字符在 bash 中似乎不起作用,因此如果您正在使用它,请尝试将其替换为完整路径。

【讨论】:

谢谢。这就是我遇到的。一个可能的解决方案是仅当场将 ~ 替换为 $HOME (以防您无法更改数据源): cd $DirectoryString/#\~/$HOME 在什么发行版和版本中,'~' 似乎在 bash 中不起作用?也许$HOME 增加了可读性,但 '~' 确实适用于我所知道的所有 bash 版本和发行版。 (gnu.org/software/bash/manual/html_node/Tilde-Expansion.html)

以上是关于即使路径正确,shell 脚本 cd 也会失败的主要内容,如果未能解决你的问题,请参考以下文章

即使在 angular.json 中有正确的路径,Angular 也会显示样式 scss 错误

即使 ROBOCOPY 命令在 BAT 脚本中成功执行,JENKINS 作业也会失败

即使目录存在,iOS copyItemAtPath 大多数时候也会失败

为啥正确的 shell 脚本会给出包装/截断/损坏的错误消息? [复制]

即使 PayPal 付款失败,Magento 订单状态也会更新为“处理中”

即使在从服务器获得响应后,失败函数也会得到回调