【问题标题】:Line endings becoming messed up on scripts cloned from Git in OSX从 OSX 中的 Git 克隆的脚本的行尾变得混乱
【发布时间】:2014-09-29 15:57:12
【问题描述】:

几个月来,我一直在 bash 脚本中遇到行尾问题。我有另一台稍旧的 Macbook Pro,它可以毫无问题地运行相同的脚本。

这种情况已经发生在由不同人在不同文件夹中编写的具有不同内容的大量脚本中。它影响了我过去三个月尝试运行的每个脚本。它们来自 Github 存储库,其中主要包含我与各种其他开发人员合作的 Drupal 项目,他们都没有遇到过这个问题,也无法用他们的脚本版本重现它。我没有将它们下载为压缩文件。我总是克隆它们。它们是我无法在此处链接的私人存储库。

我认为这可能与我的 .bash_profile 设置有关,所以我尝试更改它们以匹配我的另一台机器的设置,但没有任何效果。然后我尝试完全删除所有 .bash_profile 和 .bashrc 文件(在备份它们之后)。同样,没有效果。

这个问题不是关于如何更改行尾,这在similar questions 中有介绍。它是关于如何弄清楚为什么我机器上脚本上的所有行尾都与我的另一台机器和我所有同事的机器上的不同。

这是一个影响我整个计算机的系统性问题,我正在寻找一种比编辑单个脚本更持久的解决方案。 bash 版本是 GNU bash,版本 3.2.48(1)-release (x86_64-apple-darwin12)。

【问题讨论】:

  • “这不是由我尝试运行的 bash 脚本的行尾引起的,我已经检查过了。”为什么不?您是否从脚本中删除了^M,然后尝试运行它?或者像bash ./[scriptname]一样运行它。
  • 错误提示您在 shebang 行的末尾有一个 ^M。这通常发生在将脚本保存在 MSWin 或 OS X 之前的 Mac 上,或者使用涉及的某些系统通过 FTP 传输脚本时。
  • 当我提到已经检查过它们时,我的意思是我已经尝试过这种方式调试,但它没有效果。
  • 这不是很具体。 head -n 1 script_name | cat -v 打印什么?
  • 也许您可以准确解释一下您是如何调查文件中是否包含 ^Ms 的,以及您如何得出这不是问题的结论。

标签: macos git bash


【解决方案1】:

快速总结:您的 git 配置中有 core.autocrlf = true

我创建了一个小型公共存储库,您应该可以使用它来重现问题:

git clone git@github.com:Keith-S-Thompson/hello.bash.git

这个 repo 包含一个 2 行 shell 脚本,它应该在标准输出上简单地打印 hello。我希望当你尝试它时,它会打印出来

bash: ./hello.bash: /bin/bash^M: bad interpreter: No such file or directory

在标准错误上。

我运行了以下命令来产生这种症状:

git config --local --add core.autocrlf true

我使用了--local,所以它只会影响我在本地的这个 repo 副本,但你可能有类似的东西:

[core]
        autocrlf = true

在您的 $HOME/.gitconfig 文件中(或者它可能是一些相关选项)。

你也可以使用

git config --list

列出您当前的配置,包括本地和全局设置。

删除autocrlf = true 行。 (您也可以使用git config 命令更新您的配置;运行git config --help 了解详细信息。)一旦您确认它解决了hello.bash 存储库的问题,请重新克隆您的其他存储库。

【讨论】:

  • 一切如你所说!我不知道如何在我的核心 git 设置文件中使用 autocrlf = true 。谢谢,这已经困扰我好几个月了!
【解决方案2】:

更改新行字符。在普通的 *nix 机器上,您可以使用 dos2unix 修复此问题,但 according to Google 在 osx 上您需要这样做:

cat scriptname | col -b > scriptname2

【讨论】:

  • bad interpreter 错误表明 bash 没有找到您放入 shebang 的内容,并且 ^M 不是您系统上的有效新行,bash 正在搜索 /bin/bash^M ,不适用于/bin/bash
  • 是的,但它在所有脚本上都这样做,即使在转换行尾之后也是如此。我相信你这是一个行尾错误,但脚本不是问题的根源。问题出在其他地方。
猜你喜欢
  • 1970-01-01
  • 2012-06-07
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
  • 2016-12-17
  • 2013-08-07
  • 1970-01-01
  • 2018-08-03
相关资源
最近更新 更多