引数なしで起動すると、インタラクティブスクリプトがあり、現在のシェルセッションで最初に実行されたときに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」です。