git - shell 脚本如何从外部编辑器获取输入(就像 Git 那样)?

标签 git bash shell vim

我想要一个 shell 脚本暂停,从外部编辑器获取输入,然后恢复。像这样的伪代码作为一个最小的例子:

testScript(){
  content=""
  # set value of content using vim...
  echo "$content"
}

我不想使用包,只想使用 Bash。

最佳答案

#!/bin/bash

# This uses EDITOR as editor, or vi if EDITOR is null or unset
EDITOR=${EDITOR:-vi}

die() {
    (($#)) && printf >&2 '%s\n' "$@"
    exit 1
}

testScript(){
  local temp=$(mktemp) || die "Can't create temp file"
  local ret_code
  if "$EDITOR" -- "$temp" && [[ -s $temp ]]; then
      # slurp file content in variable content, preserving trailing blank lines
      IFS= read -r -d '' content < "$temp"
      ret_code=0
  else
      ret_code=1
  fi
  rm -f -- "$temp"
  return "$ret_code"
}

testScript || die "There was an error when querying user input"
printf '%s' "$content"

如果您不想保留尾随空白行,请替换

IFS= read -r -d '' content < "$temp"

content=$(< "$temp")

您还可以添加一个陷阱,以便在临时文件创建和删除之间脚本停止的情况下删除临时文件。

我们正在尝试检查整个过程中一切是否顺利:

  • 函数testScript如果我们无法创建临时文件,则提前中止;
  • 当我们编辑临时文件时,我们会检查编辑器是否正常运行并结束,然后我们还通过检查文件是否存在且不为空来显式检查用户是否输入了至少一个字符 [[ -s $temp ]] .
  • 我们使用内置的 read 来获取可变内容中的文件。 。使用这种方式,我们不会修剪任何前导或尾随空白,也不修剪尾随换行符。变量content 包含尾随换行符!您可以使用 ${content%$'\n'} 来修剪它;另一种可能性是不使用 read完全但是content=$(< "$temp") .
  • 在继续之前,我们会明确检查函数是否返回且没有错误。

关于git - shell 脚本如何从外部编辑器获取输入(就像 Git 那样)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28705632/

相关文章:

linux - 如何在 bash 中隐藏 "Created new window in existing browser session"

java - 通过命令行中的批处理和 shell 脚本将可选的 jvm 参数传递给 java

java - 如何将 JSP 从主 java 项目中分离出来

git - 使用git作为后端存储系统

arrays - 在 bash 函数中定义一个本地数组并在该函数外部访问它

python - 启动终端时激活默认的 virtualenv(使用 bashrc)

linux - 递归地从相同的文件夹克隆权限

git - 我如何处理文件而不是二进制文件(git)

git - 如果包含项目不在 master 分支上,则递归推送子模块会抛出 "fatal: src refspec must name a ref"

bash - 为什么 $$ 返回与父进程相同的 id?