如this answer所示,可以在bash中使用带有Readline(read
)的-e
来使用向上和向下键返回以前的历史记录项:
#! /usr/bin/env bash
while IFS="" read -p "input> " -e line; do
history -s "$line" # append $line to local history
done
在zsh中执行此操作的正确方法是什么? (在循环中获取用户输入并允许上/下键历史记录完成)。这不起作用:
#! /usr/bin/env zsh
while IFS="" vared -p "input> " -c line; do
done
我认为默认情况下,zsh中的脚本会禁用历史记录。另外,我不希望历史记录来自shell,而是来自脚本中输入的输入。
答案 0 :(得分:2)
我认为你要求这些内容...... 未经测试
#! /bin/zsh -i
local HISTFILE
# -p push history list into a stack, and create a new list
# -a automatically pop the history list when exiting this scope...
HISTFILE=$HOME/.someOtherZshHistoryFile
fc -ap # read 'man zshbuiltins' entry for 'fc'
while IFS="" vared -p "input> " -c line; do
print -S $line # places $line (split by spaces) into the history list...
done
<强> [编辑] 强>
请注意,我已将-i
添加到第一行(#!
)。它只是一种表明shell必须以交互模式运行的方法。实现这一目标的最佳方法是
只需用zsh -i my-script.zsh
执行脚本,因为将参数传递给#!
命令在Linux和OSX之间是不同的,所以它原则上是一个不应该依赖的东西。
老实说,为什么不用一些自定义配置启动一个新的交互式shell,并且(如果有必要)在命令之间挂钩?实现这一目标的最佳方法可能是使用不同的配置文件启动一个新的shell,这是一个新的历史记录。
这是一种更好的方法:
mkdir ~/abc
echo "export HISTFILE=$HOME/.someOtherZshHistoryFile;autoload -U compinit; compinit" >! ~/abc/.zshrc
ZDOTDIR=~/abc/ zsh -i
然后您可以更改脚本的配置文件以执行您需要的任何其他自定义(不同的颜色提示,无历史记录保存等)。
要使用用户输入实际执行操作,您应该使用add-zsh-hook
处理的许多挂钩之一