Linux History命令在终端中工作,但不';当作为bash脚本编写时
我有一个简单的单衬里,在航站楼中非常有效:Linux History命令在终端中工作,但不';当作为bash脚本编写时,linux,bash,shell,terminal,history,Linux,Bash,Shell,Terminal,History,我有一个简单的单衬里,在航站楼中非常有效: history | sort -k2 | uniq -c --skip-fields=1 | sort -r -g | head 功能:给出用户最近最常用的10个命令。(不要问我为什么要实现这样的目标) 我启动一个编辑器,然后用#键入相同的内容/bin/bash开头: #!/bin/bash history | sort -k2 | uniq -c --skip-fields=1 | sort -r -g | head 并将其保存为script.s
history | sort -k2 | uniq -c --skip-fields=1 | sort -r -g | head
功能:给出用户最近最常用的10个命令。(不要问我为什么要实现这样的目标)
我启动一个编辑器,然后用#键入相同的内容/bin/bash
开头:
#!/bin/bash
history | sort -k2 | uniq -c --skip-fields=1 | sort -r -g | head
并将其保存为script.sh
。然后,当我转到同一个终端时,键入bash script.sh
并按Enter键,什么也没有发生
到目前为止,我一直在尝试:谷歌搜索。许多人也有类似的痛苦,但他们通过sudo su
或添加/删除空格得到了解决。这些对我都不起作用。你知道我哪里会出错吗
编辑: 我想从终端本身开始。运行此脚本的系统可能提供或不提供更改主文件夹中文件的权限
BryceAtNetwork23提出的另一个问题是,
history
命令有什么特别之处,阻止我们执行它?查看您的历史只有在交互式shell中才有意义。使该命令成为函数而不是独立脚本。在~/.bashrc中,放置
popular_history() {
history | sort -k2 | uniq -c --skip-fields=1 | sort -r -g | head
}
要使用非交互式shell中的历史记录,需要启用它;默认情况下,它仅对交互式Shell启用。可以将以下行添加到shell脚本:
set -o history
似乎只有交互式Shell会按默认值读取默认历史记录文件,因此您需要使用下一行显式填充历史记录列表:
history -r ~/.bash_history
(阅读
bash
手册页了解有关使用默认文件以外的文件的更多信息.bash\u history
)在bash脚本上默认禁用history命令,这就是为什么
“历史记录”命令在.sh文件中不起作用。因为它的重定向。好心的
重定向.sh文件中的bash_历史文件
历史机制也可以通过提及历史文件和更改运行时参数来启用,如下所述
#!/bin/bash
HISTFILE=~/.bash_history
set -o history
注意:上面提到的脚本文件顶部的两行。现在历史命令将在历史中工作 该死!有解决办法吗?实际上,我正在创建这个脚本供其他人使用。我需要通过一个bash脚本实现这一点,而不需要编辑它们的~/.bashrc。然后,您必须告诉它们使用
源脚本.sh
(或.script.sh
)而不是执行它。没有其他方法:脚本必须在用户的当前shell中运行,而不是在非交互式子shell中运行。为什么工作?它将输出保存到一个文件中,但在其他方面是相同的。历史扩展默认情况下仅在交互式shell中启用,但可以在非交互式shell中使用set-o History
启用。.bash_history
的内容可能需要使用history-r~/.bash_history
显式添加到当前shell的历史记录列表中。虽然确实可以通过脚本在非交互式shell中完成任务,我同意@glennjackman的观点,即这确实是您希望在函数中以交互方式使用的东西。我查找了这个答案:并尝试了history
命令的建议。它仍然不起作用。我想问一个更好的问题,history
有什么特别之处,阻止我们在脚本中捕获它的输出?但是,试图绕过交互式命令历史仅在交互式shell中有用这一事实是很奇怪的。也许有人会说Bash不需要像那样默认地拒绝它,但在给定的情况下,明智的做法是采用(改编自)glennjackman的答案。对于查看历史的非常有限的应用,我可能会说这是合理的。但是直接使用历史文件可能和使用内置的历史文件一样容易。