인수 없이 시작하면 대화형 스크립트가 있고 현재 셸 세션에서 처음 실행될 때 ASCII 아트 로고를 인쇄하고 싶습니다. 어떻게 든 감지 할 수 있습니까?
도우미 파일을 작성하지 않고 이 작업을 수행하고 싶다는 것을 언급하는 것을 잊어버렸습니다. 쉘 내부에서 감지할 수 있습니까? 일부 프로세스 로그가 있습니까?
답변1
나는 두 가지 방법을 생각할 수 있습니다 :
첫째, 스크립트는 이름에 상위 쉘의 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"입니다.