首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查脚本是否已在当前shell会话中运行。

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

Unix & Linux用户
提问于 2021-02-07 03:49:28
回答 2查看 226关注 0票数 0

我有一个没有参数启动的交互式脚本,我希望它在当前shell会话中第一次运行时打印一个ASCII-art徽标。这有可能被检测到吗?

我忘了提到,我不想写到帮助文件,我想要这样做。有可能在外壳内检测到吗?有一些进程日志吗?

EN

回答 2

Unix & Linux用户

发布于 2021-02-07 15:05:26

我能想到两种方法:

首先,脚本试图创建一个名为父shell PID的文件

代码语言:javascript
复制
#!/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“选项:

代码语言:javascript
复制
myscript() {
    if [[ ! -v MYSCRIPT_HAS_RUN ]]; then
        export MYSCRIPT_HAS_RUN=$(printf '%(%s)T' -1)  # timestamp
        set -- -A "$@"
    fi
    command myscript "$@"
}

并添加到myscript中:

代码语言:javascript
复制
while getopts :A opt; do
    [[ $opt == A ]] && echo "$ascii_art"
done
shift $((OPTIND-1))

或者,从功能上打印ASCII艺术。

票数 1
EN

Unix & Linux用户

发布于 2021-02-08 02:30:22

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

代码语言:javascript
复制
#!/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。标志文件名为"Username.Scriptname“,以避免干扰。

票数 -1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/633086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档