在 VIM shell 脚本中调用“history”命令

在 VIM shell 脚本中调用“history”命令

完全的编程新手,可能极其天真——请忍耐一下。

作为当前作业的一部分,我们被赋予了将特定命令分组到 shell 脚本中的任务。(日期、主机名、arch...等...top、历史记录),使用 VIM 输入脚本。

我的脚本非常简单,大量使用“echo”来创建空行,以便于阅读。我几乎可以完成所有工作 - 除了每次运行 shell 脚本时,它在到达“history”命令时都会失败。

脚本部分如下:

echo Finally, here is the output of the history command
echo
history
echo
echo -------------THE END---------------------

但是运行脚本(使用“sh [filename].sh”)时,输出内容为:

[filename].sh: 66: [filename].sh: history: not found

图 66 指的是文本文档/脚本的行。

有人能帮我实现这个功能吗?我觉得应该很简单,但我尝试了多种方法,每次都收到“未找到”消息。

谢谢你的时间!

答案1

通过输入sh shellattempt2.sh,您可能会强制使用 shell 解释器来解释脚本/bin/sh- 在 Ubuntu 上,dash默认情况下它不是 bash

dash shell 没有history,所以才会出现错误

[filename].sh: 66: [filename].sh: history: not found

相反,确保你的脚本有适当的shebang第一行

#!/bin/bash

然后使其可执行(chmod +x [filename].sh)然后使用运行它

./[filename].sh

然而,bash默认情况下只启用历史记录交互式外壳最简单的方法是从脚本访问 shell 历史记录(该脚本以自己的方式运行-interactive shell) 可能是直接查看历史文件本身,例如

cat "$HISTFILE"

答案2

除了steeldriver的答案之外,如果您添加了#!/bin/bash,要输出当前bash会话的历史记录,您可以使用source函数:

source shellattempt2.sh

由于#!/bin/bash添加了,当前 bash 会话中没有历史输出。

如果您historycat $HISTFILE或替换,cat "$HISTFILE"也使用source。但它不会输出当前 bash 会话的历史记录。

source --help
source: source filename [arguments]
    Execute commands from a file in the current shell.

    Read and execute commands from FILENAME in the current shell.  The
    entries in $PATH are used to find the directory containing FILENAME.
    If any ARGUMENTS are supplied, they become the positional parameters
    when FILENAME is executed.

    Exit Status:
    Returns the status of the last command executed in FILENAME; fails if
    FILENAME cannot be read.

相关内容