完全的编程新手,可能极其天真——请忍耐一下。
作为当前作业的一部分,我们被赋予了将特定命令分组到 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 会话中没有历史输出。
如果您history
用cat $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.