我想要一个 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/