Hora / data atual como uma variável no BASH e parando um programa com um script

0

Estou tentando criar um bug de cam espião de framboesa pi. Eu estou tentando fazer com que o novo arquivo criado para os vários processos surja com

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

que funciona bem. mas requer um eco para atualizar o tempo $NOW também está no arquivo /home/pi/.bashrc Mesmo problema, não atualiza wo

. ~/.bashrc 

Eu encontrei neste fórum aqui e funciona:

#! /bin/bash

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

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

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

echo $filename;

Eu não entendo como funciona antes da saída do raspistil e entre aspas.

Agradeço a todos antecipadamente !!!

    
por Reckless Liberty 05.03.2018 / 11:54

2 respostas

5

Quando você faz

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

ou, usando uma sintaxe mais moderna,

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

a variável NOW será definida para a saída do comando date no momento em que a linha é executada. Se você fizer isso em ~/.bashrc , então $NOW será um timestamp que informa quando você iniciou a sessão atual do shell interativo.

No script que você está mostrando, a variável NOW está sendo definida quando o script é executado (é isso que você quer).

Quando o assigment

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

é realizado, o shell expandirá a variável na string. Ele faz isso mesmo que esteja entre aspas duplas. Aspas simples param o shell de expandir as variáveis incorporadas (isto é não o que você quer neste caso).

Note que você não parece realmente usar a variável filename na chamada para raspistill , então eu não tenho certeza porque você definiu seu valor, a menos que você apenas queira que ele seja mostrado por echo em o fim.

No restante do código, você deve colocar aspas duplas na expansão da variável $NOW (e $filename ). Se você não fizer isso e depois alterar como você define NOW para que inclua espaços ou curingas (padrões de globalização de nomes de arquivo), os comandos que usam $NOW podem falhar ao analisar sua linha de comando corretamente.

Compare, por exemplo,

string="hello * there"

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

com

string="hello * there"

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

Itens relacionados:

por 05.03.2018 / 12:23
0

Esta resposta é algumas dicas práticas:

  1. Não use caracteres como : para nomear arquivos! Antes de usar qualquer caractere não-alfanumérico, pergunte a si mesmo se ele pode atrapalhar qualquer script futuro ou uma frase de linha de comando. Use um traço ou sublinhado, ou apenas aperte os elementos juntos sem delimitador.

  2. Como sua pergunta indica que você está usando bash , você deve saber que as versões recentes desse shell incluem uma versão nativa da saída de especificação de data com o comando printf do próprio shell. Use assim:

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

ou

NOW=$(printf "%(%F_%H%M%S)T")
  1. A versão bash da impressão de uma data-especificação tem a vantagem adicional de dois recursos não presentes: "-1 representa a hora atual e -2 representa a hora em que a shell foi invocada. Se nenhum argumento for especificado, a conversão se comporta como se tivesse sido dada -1 ". Por exemplo,

    ENTÃO = $ (printf "% (% F_% H% M% S) T" -2)

por 05.03.2018 / 13:24