shell bash优化了从磁盘阅读源文件吗?

68de4m5k  于 2023-02-13  发布在  Shell
关注(0)|答案(2)|浏览(127)

假设我从$PROMPT_COMMAND中获得了一个bash脚本,也就是说,每次按下enter键时,这使得它非常频繁,当文件没有更改时,bash是否以某种方式优化了它?
编辑:澄清一下,我只问从磁盘加载脚本的内容,而不是优化代码本身。一个可以手动优化的例子是检查源文件是否具有相同的修改日期和大小[1],如果是,然后 * 不 * 再次从磁盘读取文件,而是使用内存中已经解析的脚本并执行该脚本。如果该文件只包含bash函数定义,那么我们还可以设想一种优化,其中这些定义根本不需要更改(重新计算)--假定内容是相同的。
上下文:默认情况下,rsync会查看文件大小和元数据(修改时间)来确定文件是否发生了更改,这样做肯定是确定文件是否发生更改的明智方法--不管这种更改是否可能被破坏。
[1]或者,如果文件系统还存储文件的校验和,那么这将是一个更好的方法来确定磁盘上的文件没有改变。

bybem2ql

bybem2ql1#

为了避免对术语“优化”产生误解:

  • 看起来你很关心从磁盘加载源文件所花费的时间(这种特殊形式的优化通常被称为 * 缓存 *)
  • ...与执行已加载文件所需的时间无关(* 优化 * 由编译器完成,例如gcc -O2

据我所知,bash既不缓存文件内容也不优化脚本,虽然底层文件系统或操作系统可以缓存文件,但是bash必须重新解析缓存的文件;这可能比从现代磁盘(例如SSD)加载它需要更长的时间。
我不会太担心这些事情,除非它们真的成为你的问题。如果它们真的成为你的问题,你可以很容易地......

自己缓存脚本

将源文件的全部内容 Package 在一个函数定义中。然后在shell启动时将该文件作为源文件。之后,您可以从内存中运行该函数。

定义我的提示命令.sh

my_prompt_command() {
  # a big script
}

.巴西人权委员会

source define-my-prompt-command.sh
PROMPT_COMMAND=my_prompt_command
uxhixvfz

uxhixvfz2#

您可以尝试将以下代码段添加到脚本中:

if ! type reload-sourced-file > /dev/null 2>&1 ; then
    echo "This is run when you first source the file..."
    PROMPT_COMMAND=$'reload-sourced-file\n'"$PROMPT_COMMAND"
    absolute_script_path=$(realpath -e $BASH_SOURCE)
    script_previous_stat=$(stat -c "%B%y%z" $absolute_script_path)
fi

reload-sourced-file(){
    local stat=$(stat -c "%B%y%z" "$absolute_script_path")
    if ! test "$stat" = "$script_previous_stat"; then # Re-source when stat changes.
        script_previous_stat="$stat"
        echo "You'll see this message for the following Re-sourcings."
        source "$absolute_script_path"
    fi
}

当统计信息改变时,脚本将被重新源化。希望统计信息被文件系统缓存。

相关问题