我有兴趣在terminal中inputsearch关键字,并能够immediately
interactively
地看到输出。 这意味着,就像在google中search一样,我希望在每个字符或单词input后立即获得结果。
我把WATCH命令和FIND命令结合起来,但是无法带来交互式的通话。
让我们假设,在文件名中search名字为'hint'的文件,我使用这个命令
$ find | grep -i hint
这几乎给了我体面的输出结果。
但我想要的是相同的行为交互,这意味着没有重新键入命令,但只inputSEARCH STRING。
我想写一个shell脚本,它从STDIN中读取并每1秒执行一次上面的PIPED-COMMAND。 因此,我所input的每一个命令都需要它作为一个指令。 但WATCH命令不是交互式的。
我感兴趣的是下面那种OUTPUT:
$ hi ./hi ./hindi ./hint $ hint ./hint
如果任何人都可以用更好的替代方法来替代我的PSUEDO CODE,那也不错
偶然发现这个老问题,发现它很有趣,并且认为我会试一试。 这BASH脚本为我工作:
#!/bin/bash # Set MINLEN to the minimum number of characters needed to start the # search. MINLEN=2 clear echo "Start typing (minimum $MINLEN characters)..." # get one character without need for return while read -n 1 -si do # get ascii value of character to detect backspace n=`echo -n $i|od -i -An|tr -d " "` if (( $n == 127 )) # if character is a backspace... then if (( ${#in} > 0 )) # ...and search string is not empty then in=${in:0:${#in}-1} # shorten search string by one # could use ${in:0:-1} for bash >= 4.2 fi elif (( $n == 27 )) # if character is an escape... then exit 0 # ...then quit else # if any other char was typed... in=$in$i # add it to the search string fi clear echo "Search: \""$in"\"" # show search string on top of screen if (( ${#in} >= $MINLEN )) # if search string is long enough... then find "$@" -iname "*$in*" # ...call find, pass it any parameters given fi done
希望这样做你打算(编)做。 我包括一个“开始目录”选项,因为如果你搜索整个主文件夹或者其他东西,这些列表可能会变得非常笨拙。 只要转储$1
如果你不需要它。 在$n
使用ascii值应该很容易包含一些热键功能,如退出或保存结果。
编辑:
如果您启动脚本,它将显示“开始输入…”并等待按键被按下。 如果搜索字符串足够长(由变量MINLEN
定义),则任何按键都将触发使用当前搜索字符串的find
运行( grep
看起来有点冗余)。 该脚本通过给定的任何参数来find
。 这允许更好的搜索结果和更短的结果列表。 例如-type d
将限制搜索到目录, -xdev
将保留在当前文件系统上的搜索等(见man find
)。 退格将缩短搜索字符串1,而按退出将退出脚本。 当前的搜索字符串显示在最上面。 我用-iname
搜索是不区分大小写的。 将其更改为`-name'以获取区分大小写的行为。
下面的代码将stdin
输入作为stdin
,过滤方法作为"$1"
的宏,输出转到stdout
。
你可以使用它,例如,如下所示:
#Produce basic output, dynamically filter it in the terminal, #and output the final, confirmed results to stdout vi `find . | terminalFilter`
默认的过滤宏是grep -F "$pattern"
,脚本提供的模式变量是当前输入的内容。 作为当前输入内容的函数的即时结果显示在终端上。 当按<Enter>
,结果变成最终的,并输出到stdout
。
#!/usr/bin/env bash ##terminalFilter del=`printf "\x7f"` #backspace character input="`cat`" #create initial set from all input #take the filter macro from the first argument or use # 'grep -F "$pattern"' filter=${1:-'grep -F "$pattern"'} pattern= #what's inputted by the keyboard at any given time printSelected(){ echo "$input" | eval "$filter" } printScreen(){ clear printSelected #Print search pattern at the bottom of the screen tput cup $(tput lines); echo -n "PATTERN: $pattern" } >/dev/tty #^only the confirmed results go `stdout`, this goes to the terminal only printScreen #read from the terminal as `cat` has already consumed the `stdin` exec 0</dev/tty while IFS=$'\n' read -s -n1 key; do case "$key" in "$del") pattern="${pattern%?}";; #backspace deletes the last character "") break;; #enter breaks the loop *) pattern="$pattern$key";; #everything else gets appended #to the pattern string esac printScreen done clear printSelected