首页 > 解决方案 > Basename 最后返回带有附加“\r\r\r”的文件名?

问题描述

我正在尝试编写简单的 shell 脚本,将 github 存储库然后将 CD 克隆到文件夹中。我有

#!/bin/bash
# $1 is github repo url
url=$1
reponame=$(basename $url)
git clone $url
echo $reponame
cd $reponame

现在当我跑

bash deploy_app.sh https://github.com/username/reponame

它回显了正确的 $reponame 但下一行返回此“cd: $'reponame\r\r\r\r': No such file or directory”

我不知道 "\r\r\r\r" 部分来自哪里。它不在回购名称中,当我只是回应它时它不是 $reponame 的一部分。知道为什么会这样吗?

标签: bashshell

解决方案


首先要看的是你的脚本本身,通过执行以下操作:

od -xcb deploy_app.sh

并在行尾(或任何行)查找任何回车符(CR, ^M, \r, hex0d或 octal 015)。cd

那是因为,如果你最后 CR字符,就会导致这个问题(^M下面的字符是用 输入的CTRL-VCTRL-M):

pax:~> cd blah^M^M^M^M
-bash: cd: $'blah\r\r\r\r': No such file or directory

如果您的文件中 CR字符,您可能想要删除它们,并检查您的行尾设置git(假设该文件回购中) - 如果您从两者更新您的回购,这通常是由不正确的设置引起的Windows 和 Unix。

如果该文件没有被“损坏” git,您将需要发现还有什么将这些字符放入其中。


而且,顺便说一句,您实际上不会看到这些字符是否reponame带有echo,因为回显它们会产生实际字符,四个“转到行首”字符,然后是“转到下一行“ 特点。因此,如果不通过类似od.


推荐阅读