Текущее время / дата как переменная в BASH и остановка программы с помощью скрипта

Все привязки клавиш экрана GNU работают точно так же в byobu.

Чтобы выбрать окно , просто нажмите Ctrl + a , затем Номер окна

Обратите внимание, что Ctrl + a конфликтует с привязкой ключей GNU Emacs, поэтому byobu попросит вас выбрать поведение.

В любом случае вы можете использовать Ctrl + a , затем a , чтобы перейти к началу строки в режиме привязки ключей Emacs.

1
05.03.2018, 13:13
3 ответа

Cuando lo haces

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

o, utilizando una sintaxis más moderna,

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

la variable NOWse establecerá en la salida del comando dateen el momento en que se ejecute esa línea. Si hace esto en ~/.bashrc, entonces $NOWserá una marca de tiempo que le indicará cuándo inició la sesión de shell interactiva actual.

También puede establecer el valor de la variable con

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

si está utilizando bashversión 4.2 o posterior. Esto imprime la marca de tiempo directamente en la variable sin llamar a date.

En el script que está mostrando, la variable NOWse establece cuando se ejecuta el script (esto es lo que desea ).

Cuando la asignación

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

, el shell expandirá la variable en la cadena. Lo hace aunque esté entre comillas dobles. Las comillas simples impiden que el shell expanda las variables incrustadas (esto es no lo que desea en este caso ).

Sin embargo, tenga en cuenta que no parece utilizar la variable filenameen la llamada a raspistill, por lo que no estoy seguro de por qué establece su valor, a menos que solo quiera que echolo emita en el fin.

En el resto del código, debe comillas dobles la $NOWexpansión variable (y$filename). Si no lo hace, y luego cambia la forma en que define NOWpara que incluya espacios o comodines (patrones de englobamiento de nombres de archivo ), los comandos que usan $NOWpueden fallar al analizar su línea de comando correctamente.

Comparar, por ejemplo,

string="hello * there"

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

con

string="hello * there"

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

Cosas relacionadas:

22
27.01.2020, 23:11

Этот ответ представляет собой несколько практических указаний:

  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
    
2
27.01.2020, 23:11

Я искал способ действительно обновлять время во время работы скрипта в bash, чтобы предотвратить stompage для файлов, которые я обновлял более одного раза (да да )и по-прежнему просто «назначать» к переменной. Почти уверен, что это не проблема в Perl, но это было давно.

Ответ пользователя 1404316 не работает для меня с bash 4.2 на RHEL.

Вот как я решил эту проблему в 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, так как я просмотрел этот код, пытаясь найти правильное решение.
0
06.05.2020, 19:12

Теги

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