.bash_profile中的语法错误,文件意外结束

时间:2018-06-19 14:00:43

标签: bash unix syntax sublimetext3

运行MacOS High Sierra 10.13.5

美好的一天!今天,我试图在.bash_profile中编写一个脚本,以使我可以通过一个命令sublime调用Sublime Text。

这是我在缺乏bash知识和一些研究的情况下制作的脚本:

sublime_open()     # Function which opens the first argument as a text file in Sublime.
{
    open -a /Applications/Sublime\ Text.app < $1.txt;
}

export -f sublime_open;

sublime_test()     # Function which will open first argument as a text file in Sublime,
{                  # creating one if it does not exist in the current directory.
    if [ -e "$1" ];
    then sublime_open "$1"
    else
    touch "$1".txt
    sublime_open("$1")
    fi
}

export -f sublime_test
alias sublime="sublime_test"
export sublime  


出于可读性考虑,我将该函数分为两部分。


预期的行为:

sublime foo将Sublime的实例打开到文件foo.txt,如果该文件不存在,则创建该文件。


观察到的行为:

重击返回:

  

第29行:语法错误:文件意外结束

请注意,第29行是文件最后一行之后的行,该行不存在。


尝试解决方案:
到目前为止,我已经搜索了解决方案herehere
我尝试过:

  • 复制到新的bash配置文件并删除旧的bash配置文件以删除“幽灵”字符
  • 在我的.bash_profile上运行dos2unix
  • 我自己分析脚本以查找单个错误,该问题似乎发生在sublime_open()部分。

很抱歉,如果我的脚本是基本脚本还是不了解该脚本,这是我第一次尝试编写具有这种行为的脚本。欢迎在问题范围之外的帮助或提示。

谢谢!

编辑:修复了@jwodder解决方案中误用的heredoc以及@codeforester解决方案中不正确的函数调用的问题。

编辑2:如果您正在寻找更优雅的解决方案来解决同一问题,请查看this very helpful gist.

2 个答案:

答案 0 :(得分:2)

问题是这一行:

open -a /Applications/Sublime\ Text.app << $1.txt;

我假设您要执行的操作是将$1.txt的内容提供给标准输入中的Sublime Text。但是,可以使用一个<而不是两个来完成。使用两个<,您将得到一个heredoc,这意味着bash将查找仅包含$1.txt的下一行,并将所有中间的行用作Sublime Text的输入。当文件在bash找到仅$1.txt的行之前结束时,您将收到“文件末尾意外”错误。

答案 1 :(得分:0)

请记住,在macOS上,*.app只是一个文件夹。一般来说,您需要指定二进制文件(或脚本)的位置。对于Sublime Text,您必须使用Sublime Text CLI工具:

/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl

有关详细信息,请参见OS X Command Line documentation