运行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行是文件最后一行之后的行,该行不存在。
尝试解决方案:
到目前为止,我已经搜索了解决方案here和here。
我尝试过:
sublime_open()
部分。 很抱歉,如果我的脚本是基本脚本还是不了解该脚本,这是我第一次尝试编写具有这种行为的脚本。欢迎在问题范围之外的帮助或提示。
谢谢!
编辑:修复了@jwodder解决方案中误用的heredoc以及@codeforester解决方案中不正确的函数调用的问题。
编辑2:如果您正在寻找更优雅的解决方案来解决同一问题,请查看this very helpful gist.
答案 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。