首页 > 解决方案 > bash script.sh 和 ./script.sh 之间的区别

问题描述

假设我们的env.sh文件包含:

echo $(history | tail -n2 | head -n1) | sed 's/[0-9]* //'#寻找最后输入的命令

使用 执行此脚本时bash env.sh,输出将为空:

在此处输入图像描述

但是当我们使用 执行脚本时./env.sh,我们会得到最后输入的命令:

在此处输入图像描述

我只想知道他们之间的区别

请注意,如果我们#!/bin/bash在脚本开头添加,./env.sh将不再输出任何内容。

标签: bashshell

解决方案


默认情况下,BASH 在非交互式 shell 中禁用历史记录。但是,如果你想启用它,你可以这样做:

#!/bin/bash

echo $HISTFILE # will be empty in non-iteractive shell

HISTFILE=~/.bash_history # set it again
set -o history
# the command will work now
history

这样做的原因是为了避免任何 shell 脚本运行的任何命令弄乱历史记录。

在运行时将 hashbang(意味着文件将由 hashbang 中指定的程序解释为脚本)到您的脚本中,使用二进制文件即 run via./env.sh调用您的脚本,因此再次不打印任何历史记录。/bin/bashbash


推荐阅读