11

この回答に示されているように、bashreadで Readline ( -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のスクリプトでは、デフォルトで履歴の補完が無効になっていると思います。また、履歴をシェルから取得するのではなく、スクリプトに入力された入力から取得したいと考えています。

4

1 に答える 1

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最初の行 に追加した通知( #!)。これは、シェルが対話モードで実行されている必要があることを示す方法にすぎません。これを実現する最善の方法は、単純に を使用してスクリプトを実行することです。これは、Linux と OSX ではコマンドzsh -i my-script.zshに引数を渡す方法が異なるため、原則として依存すべきではありません。#!

正直なところ、カスタム構成と (必要であれば) コマンド間のフックを使用して、新しい対話型シェルを開始してみませんか? これを実現する最善の方法は、異なる構成ファイルと新しい履歴を使用して新しいシェルを開始することです。

これは、これを行うためのはるかに優れた方法です。

 mkdir ~/abc
 echo "export HISTFILE=$HOME/.someOtherZshHistoryFile;autoload -U compinit; compinit" >! ~/abc/.zshrc
 ZDOTDIR=~/abc/ zsh -i

その後、スクリプトの構成ファイルを変更して、必要な他のカスタマイズを実行できます (別の色のプロンプト、履歴の保存なしなど)。

ユーザー入力を実際に処理するには、によって処理される多くのフックの 1 つを使用する必要があります。add-zsh-hook

于 2015-09-08T08:59:03.637 に答える