历史命令可以在终端中运行,但在编写为 bash 脚本时则不能运行

问题描述 投票:0回答:3

我有一个简单的单行代码,可以在终端中完美运行:

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
命令有什么特别之处,阻止我们执行它?

linux bash shell terminal command-history
3个回答
7
投票

查看您的历史记录仅在交互式 shell 中才有意义。使该命令成为一个函数而不是一个独立的脚本。在你的 ~/.bashrc 中,放入

popular_history() {
    history | sort -k2 | uniq -c --skip-fields=1 | sort -r -g | head
}

5
投票

要从非交互式 shell 使用历史记录,您需要启用它;它仅在交互式 shell 中默认打开。您可以将以下行添加到 shell 脚本中:

set -o history

似乎只有交互式 shell 才会默认读取默认历史文件,因此您需要使用下一行显式填充历史列表:

history -r ~/.bash_history

(有关使用默认文件

bash
以外的文件的更多信息,请阅读
.bash_history
手册页。)


-1
投票

历史记录命令在 bash 脚本上默认被禁用,这就是为什么即使 历史命令在 .sh 文件中不起作用。为其重定向。亲切地 重定向 .sh 文件内的 bash_history 文件。

还可以通过提及历史文件并更改运行时参数来启用历史机制,如下所述

#!/bin/bash
HISTFILE=~/.bash_history
set -o history 

注意:上面提到了脚本文件顶部的两行。现在历史命令将在历史中起作用。

© www.soinside.com 2019 - 2024. All rights reserved.