Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux History命令在终端中工作,但不';当作为bash脚本编写时_Linux_Bash_Shell_Terminal_History - Fatal编程技术网

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的答案。对于查看历史的非常有限的应用,我可能会说这是合理的。但是直接使用历史文件可能和使用内置的
历史文件一样容易。