Mudei o prompt no meu .bashrc para mostrar o horário atual. Este era o prompt original (de uma instalação nova do MX Linux)
PS1="$PURPLE\u$nc@$CYAN\H$nc:$GREEN\w$nc\\n$GREEN\$$nc "
e eu mudei para isso
PS1="$PURPLE\u$nc@$CYAN\H$nc $YELLOW$(date '+%Y-%m-%d %H:%M:%S')$nc $REEN\w$nc\\n$GREEN\$$nc "
Quando abro um terminal, vejo a data e a hora atuais no prompt. Novos prompts não são exibidos com o horário em que foram gerados. Eles sempre mostram o mesmo horário do primeiro prompt. O que estou fazendo errado?
Entre aspas duplas, as expansões acontecem no momento da avaliação, o que significa que
date
é executado quandoPS1
é atribuído — isso produz o resultado que você está vendo, onde a data e a hora são armazenadas inicialmente e nunca atualizadas.Você precisa usar aspas simples em torno da
date
substituição para que ela seja avaliada sempre que o prompt for exibido:Em vez de invocar
date
manualmente, você também pode usar o suporte interno do shell para datas em prompts:\d
é substituído pela data no formato “weekday month date” e\D{format}
é substituído pela data no formato fornecido, com a mesma sintaxe que você usou (strftime
sintaxe). Assim:A vantagem de usar aspas duplas aqui é que todas as outras expansões de variáveis acontecem quando a variável é avaliada pela primeira vez, o que economiza algum (quantidade minúscula de) tempo toda vez que o prompt é exibido. Como as variáveis usadas no prompt provavelmente não mudarão, não há desvantagens aqui.
Veja Controlando o Prompt no manual do bash para mais detalhes.
Outra opção... escapar do
$
in$(date ...)
para evitar que adate
chamada seja executada quandoPS1
estiver sendo definida; a nova definição se torna: