現在のシェルセッションでスクリプトがすでに実行されていることを確認してください。

現在のシェルセッションでスクリプトがすでに実行されていることを確認してください。

引数なしで起動すると、インタラクティブスクリプトがあり、現在のシェルセッションで最初に実行されたときにASCIIアートのロゴを印刷したいと思います。何とか検知できますか?

ヘルパーファイルを作成せずにこれを実行したいことに言及するのを忘れました。シェル内で検出できますか?いくつかのプロセスログがありますか?

答え1

私は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
...

欠点:これらのファイルは何とかクリーンアップする必要があります。


2: スクリプトのラッパー関数を作成します。プログラムが呼び出されると仮定し、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実行がない場合です。干渉を避けるため、フラグファイル名は「username.scriptname」です。

関連情報