我几个月来一直在关于bash脚本的行结尾问题。我有另一个稍微陈旧的Macbook Pro,可以毫无问题地运行相同的脚本。
这种情况发生在许多脚本中,这些脚本由不同的人在不同的文件夹中编写。它影响了我过去三个月试图运行的每个脚本。它们来自Github repos,其中包含我与其他各种开发人员合作的Drupal项目,他们都没有遇到过这个问题,并且无法使用他们的脚本版本重现它。我没有将它们下载为压缩文件。我总是克隆它们。它们是私人回购,我无法在这里链接。
我想也许这与我的.bash_profile设置有关,所以我尝试更改它们以匹配我的其他机器的那些,这没有任何影响。然后我尝试完全删除所有.bash_profile和.bashrc文件(在备份之后)。再一次,没有效果。
这个问题不是关于如何更改行结尾,similar questions中介绍了这一点。它是关于如何弄清楚为什么我机器上的脚本上的所有行结尾都与我的其他机器上的所有行结束以及我的所有同事的机器上的不同。
这是一个影响我整个计算机的系统性问题,我正在寻找一种比编辑单个脚本更持久的解决方案。 bash版本是GNU bash,版本3.2.48(1)-release(x86_64-apple-darwin12)。
答案 0 :(得分: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
在stderr上。
我运行以下命令来产生此症状:
git config --local --add core.autocrlf true
我使用--local
所以它只影响我这个仓库的本地副本,但你可能会有类似的东西:
[core]
autocrlf = true
在$HOME/.gitconfig
文件中(或者可能是某些相关选项)。
您也可以使用
git config --list
列出您当前的配置,包括本地和全局设置。
删除autocrlf = true
行。 (您也可以使用git config
命令更新配置;有关详细信息,请运行git config --help
。)一旦您确认它修复了hello.bash
repo的问题,请重新克隆你的其他回购。
答案 1 :(得分:0)
更改新行char。在正常的* nix框中,您使用dos2unix
进行修复,但according to Google,在osx上需要执行此操作:
cat scriptname | col -b > scriptname2