Проверить, был ли скрипт уже запущен в текущем сеансе оболочки

Если вы не хотите видеть интерактивный дисплей, вы можете позволить ему выводить только один -снимок, после чего вам больше не нужна опция «ssh -t»:

top -n 1 -b
1
08.02.2021, 05:53
2 ответа

Я могу придумать 2 способа:


Во-первых, ваш скрипт пытается создать файл с 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-арт из функции.

0
18.03.2021, 22:32

Простой способ, используя дату файла флага

#!/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
18.03.2021, 22:32

Теги

Похожие вопросы