以下脚本在运行时不会为我生成输出。我真的很困惑为什么这不起作用。
#!/bin/bash
i=0
OLDIFS=$IFS
IFS=$'\n'
read -p 'Search history for? ' string
arr=( "$(history | grep "$string" | cut -c8-)" )
for item in ${arr[@]}
do
echo "$(( i++))) $item"
done
然而,这个完全相同的事情(至少对我而言似乎是相同的)在一行中直接输入我的终端时工作正常:
i=0; OLDIFS=$IFS; IFS=$'\n'; read -p 'Search history for? ' string; arr=( "$(history | grep "$string" | cut -c8-)" ); for item in ${arr[@]}; do echo "$(( i++))) $item"; done
我已将脚本设为可执行文件。我把它保存为多行和单行脚本。然而,没有任何保存的脚本产生任何输出。为什么在保存为脚本时不能正常工作,但可以直接在我的终端中正常工作?
答案 0 :(得分:2)
第echo "$(( i++))) $item"
行有一个结束括号。
echo "$(( i++ )) $item"
如果您尝试在脚本中使用history
,则会失败
尝试运行此脚本:
#!/bin/bash
history
它将不会打印任何内容,因为没有存储历史记录(对于此shell的实例)。要读取历史记录,您需要为文件提供存储的历史记录,请调用内置history
以阅读-r
,最后您可以从内存中列出历史记录:
#!/bin/bash
HISTFILE="$HOME/.bash_history"
history -r
history
这并不意味着命令将被写入文件,而是由不同的选项控制。
#!/bin/bash
read -p 'Search history for? ' string
i=0
OLDIFS=$IFS
IFS=$'\n'
HISTFILE="$HOME/.bash_history"
history -r
IFS=$'\n' read -d '' -a arr <<<"$(history | grep "$string" | cut -c8-)"
for item in ${arr[@]}
do echo "$(( i++ )) $item"
done
答案 1 :(得分:1)
看看this。显然,shell程序中禁用了bash history命令。但你可以根据这个链接解决它:
#!/bin/bash
#Add this line in to set the history file to your.bash_history
HISTFILE=~/.bash_history
set -o history
history