我有一个脚本,如果在没有参数的情况下启动,它是交互式的,并且我希望它在第一次在当前 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
最后$first
是1
有史以来的第一次执行,以及每天的第一次执行,或者0
如果没有的话。标志文件命名为“用户名.脚本名”以避免干扰。