BASH의 변수로 현재 시간/날짜 및 스크립트를 사용하여 프로그램 중지

BASH의 변수로 현재 시간/날짜 및 스크립트를 사용하여 프로그램 중지

Raspberry Pi 스파이 캠 버그를 만들려고 합니다. 개별 프로세스별로 생성된 새로운 파일이 나타나도록 만들려고 합니다

NOW=`date '+%F_%H:%M:%S'`;

좋은 결과. 하지만 파일을 업데이트하지 않고 동일한 문제에서도 $NOW시간 을 업데이트하려면 에코가 필요합니다 ./home/pi/.bashrc

. ~/.bashrc 

내가 찾은이 포럼에서효과가있다:

#! /bin/bash

NOW=`date '+%F_%H:%M:%S'`;

filename="/home/pi/gets/$NOW.jpg"

raspistill -n -v -t 500 -o $NOW.jpg;

echo $filename;

raspistil의 출력 앞에 따옴표로 묶여 있기 때문에 그것이 어떻게 작동하는지 이해하지 못합니다.

다들 감사 해요! ! !

답변1

당신이 할 때

NOW=`date '+%F_%H:%M:%S'`

또는 보다 현대적인 구문을 사용하여

NOW=$( date '+%F_%H:%M:%S' )

NOW이 변수는 이 줄이 실행될 때 명령의 출력 으로 설정됩니다 . date에서 이 작업을 수행하면 ~/.bashrc현재 $NOW대화형 셸 세션이 시작된 시기를 알려주는 타임스탬프가 표시됩니다.

다음을 사용하여 변수 값을 설정할 수도 있습니다.

printf -v NOW '%(%F_%H:%M:%S)T' -1

bash버전 4.2 이상을 사용하는 경우 . 그러면 를 호출하지 않고 타임스탬프가 변수에 직접 인쇄됩니다 date.

표시되는 스크립트에서는 NOW스크립트가 실행되는 동안 변수가 설정됩니다(원하는 대로).

할당할 때

filename="/home/pi/gets/$NOW.jpg"

실행 후 쉘은 문자열의 변수를 확장합니다. 큰따옴표로 묶인 경우에도 이 작업이 수행됩니다. 아포스트로피쉘이 내장된 변수를 확장하는 것을 방지합니다(이것은아니요이 경우 무엇을 원하시나요?)

filename호출에서 실제로 변수를 사용 하지 않는 것 같으 므로 마지막에 출력 raspistill하려는 ​​경우가 아니면 해당 값을 설정하는 이유가 무엇인지 잘 모르겠습니다 .echo

코드의 나머지 부분에서는 $NOW변수 확장(및 $filename)을 큰따옴표로 묶어야 합니다. 이 작업을 수행하지 않고 나중에 정의에 NOW공백이나 와일드카드(파일 이름 와일드카드 패턴)가 포함되도록 정의를 변경하면 사용하는 명령이 $NOW해당 명령줄을 올바르게 구문 분석하지 못할 수 있습니다.

예를 들어 비교해 보세요.

string="hello * there"

printf 'the string is "%s"\n' $string

그리고

string="hello * there"

printf 'the string is "%s"\n' "$string"

관련 사항:

답변2

이 답변은 실용적인 조언입니다.

  1. :파일 이름 지정과 같은 문자를 사용하지 마십시오 ! 영숫자가 아닌 문자를 사용하기 전에 향후 스크립트나 명령줄 한 줄짜리 코드를 망칠 수 있는지 자문해 보세요. 대신 대시나 밑줄을 사용하거나 구분 기호를 사용하지 않고 요소를 간단히 압축하세요.

  2. 귀하의 질문에 따르면 를 사용하고 있는 것으로 나타나므로 최신 버전의 셸에는 bash셸 자체 명령이 포함된 printf날짜 사양 출력의 기본 버전이 포함되어 있음을 알아야 합니다. 다음과 같이 사용하세요:

    printf "%(%F_%H%M%S)T"
    

    또는

    NOW=$(printf "%(%F_%H%M%S)T")
    

    심지어

    printf -v NOW "%(%F_%H%M%S)T"
    

    (이렇게 하면 추가 프로세스가 포크되는 것을 방지할 수 있습니다)

  3. bash인쇄 날짜 사양 버전에는 다른 경우에는 존재하지 않는 두 가지 기능이라는 추가적인 이점이 있습니다. "-1"은 현재 시간을 나타내고 -2는 셸이 호출된 시간을 나타냅니다. 인수가 지정되지 않은 경우 변환은 다음과 같이 작동합니다. -1이 주어진 경우." 예를 들어,

    printf -v THEN "%(%F_%H%M%S)T" -2
    

답변3

Bash 5 기준: 에포크(1970-01-01 00:00:00) 이후의 초 수가 요구 사항에 적합하면 사전 정의된 두 변수에서 해당 타임스탬프를 얻을 수 있습니다.

# Seconds since epoch
echo ${EPOCHSECONDS}

# Seconds with microsecond precision since epoch
echo ${EPOCHREALTIME}

# Microseconds since epoch
echo ${EPOCHREALTIME/./}

# Miliseconds since epoch
echo $(( ${EPOCHREALTIME/./} / 1000 ))

답변4

나는 여러 번 업데이트한 파일을 밟는 것을 방지하기 위해 bash에서 실행될 때 스크립트가 실제로 시간을 업데이트하도록 하고(예, 맞습니다) 변수에 단순히 "할당"하는 방법을 찾고 있습니다. Perl에서는 이것이 문제가 되지 않는다는 것이 확실하지만, 꽤 오랜 시간이 걸렸습니다.

user1404316의 답변은 RHEL의 bash 4.2에서 작동하지 않습니다.

bash 4.2에서 이 문제를 해결한 방법은 다음과 같습니다.

#!/bin/bash
now=$(printf "%(%F_%H%M%S)T")
echo printf: ${now}
sleep 1
echo printf after 1: ${now}

# Tried backticks here too :(    
then="$(date +%s)"

# This is your now date
now() { date +%s; }

# This is how you use it    
filename="something.$(now)"

echo "now ${filename}"
filename="something.${then}"
echo "then ${filename}"
sleep 1
filename2="something.$(now)"
echo "now ${filename2}"
filename2="something.${then}"
echo "then ${filename2}"

그리고 출력:

printf: 1969-12-31_190000
printf after 1: 1969-12-31_190000
now something.1588791459
then something.1588791459
now something.1588791460
then something.1588791459

이것이 누군가에게 도움이 되기를 바랍니다 :)

  1. 어느 정도 신용을 주어야 합니다알 수없는 사용자@askubuntu.com 왜냐하면 올바른 해결책을 찾으려고 노력하면서 코드를 검토했기 때문입니다.

관련 정보