正如标题所述,这应该是一件简单的事情,但我却无法让它正常工作。
我正在编写一个小型可执行脚本,它将负责输入脚本第一行所需的解释器位置并打开新脚本进行编辑。 好的,很酷...完成了:printf "#!%s" $(which bash) > $1; vim $1
。 很简单。
问题在于,脚本会自动让我从插入模式的第 2 行开始,而我之所以认为这是一个问题,只是因为我对如何操作感到好奇,但又无法实现。这样,我就处于一个空行,可以开始操作了……无需浪费 0.5 秒左右的时间按“o”(我使用 vim 作为我的文本编辑器,仅供参考)。
$(which bash)
所以我想我的问题是,当新创建的脚本在第一行打开并输出“#!”时,如何让我的自动脚本模拟按“o” ?
尝试过的事情:
- 使用 printf 转义的换行符:
printf "#!%s\n" $(which bash) > $1
- 使用带换行符标志的 echo:
echo -e "#!$(which bash)\n" > $1
答案1
这应该可以实现你想要的效果:
printf '#!%s\n\n' $(which bash) > "$1" ; vim -c startinsert +2 "$1"
它会在文件中插入两个换行符,所以不需要o。然后它会在插入模式下从第二行 (+2) 启动 vim。
此外,如果不需要扩展,则最好使用单引号而不是双引号。在这种情况下,!
可能会被解释为双引号中的历史扩展特殊字符,并完全改变打印的内容。
答案2
您尝试的方法不会有帮助,因为这不取决于文件的内容;而是取决于文本编辑器。
在 Vim 中,下面的操作应该可以工作:
vim "$file" +'$normal o' +'startinsert'
每个+
参数都在“命令模式”下解释;通常是行号,但任何命令实际上都可以起作用。:$normal o
在最后一行后附加一个空行(这很丑陋,但我想不出任何其他方式);:startinsert
进入插入模式。