date command não está sendo resolvido corretamente no bash alias

2

Estou tentando configurar uma maneira de digitar newjournal , e uma nova entrada de diário chamada year-month-date-time.txt é criada em um subdiretório year em ~/documents/journals .

Eu o configurei como um alias usando o seguinte:

alias newjournal='nano /home/username/documents/journals/'$(date +%Y)'/'$(date +%F-%k%M).txt''

Portanto, a subpasta do ano é resolvida corretamente e, da mesma forma, a primeira metade do comando date. Tentei acrescentar o apelido com sudo , não ajudou.

Problema: Por alguma razão, quando eu faço este comando, o valor do tempo ( %k ) é resolvido há alguns minutos ... ou talvez a última vez que o nano executou esse nome, talvez ele seja chamado de buffer antigo?

Quando faço logoff, faço o arquivo correto, então salvo, aguardo alguns minutos e tento novamente, e ele edita o arquivo antigo em vez de criar um novo. Mesmo se eu remover o arquivo antigo, ele cria um novo arquivo com o nome do arquivo antigo (hora incorreta).

Aqui está uma captura de tela do que estou tentando explicar. Aqui eu crio um newjournal, salvo em nano dentro de um segundo ou dois de execução do comando, imprimo a data / hora correta, liste o arquivo que foi criado. Observe o tempo incorreto do nome do arquivo (1249, conforme colocado em 13:11):

De qualquer forma, pode ser algo simples, mas eu tentei métodos diferentes no alias, como colocar aspas duplas em torno da coisa toda e escapar corretamente, aspas simples, escape e espaçamento, etc.

Obrigado pela leitura / ajuda. Servidor Ubuntu 16.04.

    
por YMGenesis 16.10.2017 / 19:28

1 resposta

5

Os comandos date são avaliados quando você declara o alias .

Veja um exemplo de alias t :

$ alias t="echo \"$(date +%k%M)\""
$ alias t
alias t='echo "1357"'

Você pode corrigir isso usando aspas simples:

$ alias t='echo "$(date +%k%M)"'
$ alias t
alias t='echo "$(date +%k%M)"'

Para mais informações, consulte Diferença entre aspas simples e duplas no Bash

Ou se o comando não precisar ser um alias, use uma função:

$ function t { echo "$(date +%k%M)"; }
$ declare -f t
t () 
{ 
    echo "$(date +%k%M)"
}

Ou um script:

#!/bin/sh
echo "$(date +%k%M)"

Atualização, por edição recente

$ alias t='echo '$(date +%k%M)''
$ alias t
alias t='echo 1400'

Pense nessa definição de alias como três strings:

  1. Uma string entre aspas simples: 'echo '
  2. Uma string sem aspas: $(date +%k%M)
  3. Uma cadeia nula entre aspas simples: ''
por wjandrea 16.10.2017 / 19:57