gpt4 book ai didi

linux - sh/bash 命令替换卡住脚本

转载 作者:太空宇宙 更新时间:2023-11-04 11:16:20 33 4
gpt4 key购买 nike

有简单的一行脚本:

myvar=`nano`

如果我用 bash 或 sh 运行它,它会卡住当前的终端 session ,并且不会显示编辑器。我尝试了其他交互式程序和不同的操作系统(Ubuntu、FreeBSD),结果总是一样的。我认为这是因为那些程序忽略了信号,但我不明白为什么它们不能以这种方式启动。

我需要这个方法,因为我想释放捕获用户文本输入并将其返回给调用者的函数。例如:

function read_text()
{
local tempfile=`mktemp`
nano $tempfile
cat $tempfile
rm $tempfile
}

echo "Press ENTER to input your comment."
read # ENTER
comment=`read_text`

更新:

感谢 tripleee 指导我解决这个问题的原因。我找到了简单的解决方案。将问题重定向到当前终端行。

有简单的一行脚本:

myvar=`nano > $(tty)`

完整示例:

read_text()
{
local tempfile=`mktemp`
nano $tempfile > `tty`
cat $tempfile
rm $tempfile
}
comment=`read_text`
echo $comment

最佳答案

您不能在 backircks 中运行交互式命令,因为反引号会阻止程序与终端之间的交互式输入和输出。

对您的问题进行合理的重构是在调用者中处理临时文件,并取消该函数;或者至少,缩小函数的范围。

local tempfile=$(mktemp)
${VISUAL-nano} "$tempfile"
comment=$(cat "$tempfile")
rm "$tempfile"

另请注意此代码如何使用 $VISUAL 并仅在未设置此标准变量时回退到 nano

对于大多数现实世界的场景,如果输入任务足够重要以保证使用外部编辑器,您可能最好绕过临时文件(使用 trap 来删除它在脚本的最后)而不是将其内容抓取到 shell 变量中。

# At the beginning of your script
tmpdir=$(mktemp -d -t yourscript.XXXXXXXX)
trap 'rm -rf "$tmpdir"' 0
trap 'exit 127' 1 2 3 5 15

:

echo '# Enter your comment here' >"$tmpdir"/comment
${VISUAL-nano} "$tmpdir"/comment

如您所见,事实证明这很简单,您实际上不需要将它封装到一个单独的函数中。

关于linux - sh/bash 命令替换卡住脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20787547/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com