检查脚本是否已在当前 shell 会话中运行

检查脚本是否已在当前 shell 会话中运行

我有一个脚本,如果在没有参数的情况下启动,它是交互式的,并且我希望它在第一次在当前 shell 会话中运行时打印 ASCII-art 徽标。这有可能以某种方式检测到吗?

我忘了提及我想在不写入帮助程序文件的情况下执行此操作。是否可以在外壳内检测到它?有一些进程日志吗?

答案1

我可以想到两种方法:


一,您的脚本尝试创建一个名称中包含父 shell PID 的文件

#!/usr/bin/env bash
already_run_file=/tmp/${0##*/}.$PPID
if [[ ! -f $already_run_file ]]; then
    echo "ascii art"
    touch "$already_run_file"
fi
...

缺点:这些文件必须以某种方式清理。


二:为脚本创建一个包装函数。假设您的程序被调用myscript,那么如果环境变量不存在,请在程序调用中添加“-A”选项:

myscript() {
    if [[ ! -v MYSCRIPT_HAS_RUN ]]; then
        export MYSCRIPT_HAS_RUN=$(printf '%(%s)T' -1)  # timestamp
        set -- -A "$@"
    fi
    command myscript "$@"
}

并且,添加到myscript

while getopts :A opt; do
    [[ $opt == A ]] && echo "$ascii_art"
done
shift $((OPTIND-1))

或者,从函数中打印 ASCII 艺术。

答案2

一种简单的方法,使用标志文件的日期

#!/bin/bash
me="${0##*/}"
typeset -i first=0
flag="/tmp/$USER.$me.run"
[[ -f "$flag" ]] || touch --date=yesterday "$flag"
if [ $(date "+%d") -ne $(date "+%d" -r "$flag") ] ;then
    first=1
fi

最后$first1有史以来的第一次执行,以及每天的第一次执行,或者0如果没有的话。标志文件命名为“用户名.脚本名”以避免干扰。

相关内容