web-dev-qa-db-fra.com

La commande de date ne se résout pas correctement dans l'alias bash

J'essaie de trouver un moyen de taper simplement newjournal et une nouvelle entrée de journal nommée year-month-date-time.txt est créée dans un sous-répertoire year dans ~/documents/journals.

Je l'ai configuré comme un alias en utilisant les éléments suivants:

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

Ainsi, le sous-dossier year se résout correctement, tout comme la première moitié de la commande de date. J'ai essayé d'ajouter le pseudonyme avec Sudo, mais cela n'a pas aidé.

Problème: pour une raison quelconque, lorsque je fais cette commande, la valeur de l'heure (%k) est résolue il y a quelques minutes ... ou peut-être la dernière fois que nano a exécuté ce nom de fichier, peut-être s'appelle-t-il un ancien tampon?

Lorsque je me déconnecte, le fichier correct est créé, puis je le sauvegarde, attend quelques minutes et réessayez. Il édite l'ancien fichier au lieu d'en créer un nouveau. Même si je supprime l'ancien fichier, il crée un nouveau fichier avec l'ancien nom de fichier (heure incorrecte).

Voici une capture d'écran de ce que j'essaie d'expliquer. Ici, je crée un nouveau journal, sauvegardé dans nano en une seconde ou deux après l’exécution de la commande, affiche la date/heure correcte et répertorie le fichier créé. Notez le temps de nom de fichier incorrect (1249, comme prévu à 13h11):

screenshot

Quoi qu'il en soit, cela pourrait être quelque chose de simple, mais j'ai essayé différentes méthodes dans l'alias, comme mettre des guillemets doubles et les échapper correctement, guillemets simples, échappements et espacements, etc.

Merci pour la lecture/aide. Serveur Ubuntu 16.04.

2
YMGenesis

Les commandes date sont évaluées lorsque vous déclarez l'alias .

Voici un exemple d'alias t:

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

Vous pouvez résoudre ce problème en utilisant des guillemets simples:

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

Pour plus d'informations, voir Différence entre guillemets simples et doubles dans Bash


Ou si la commande n'a pas besoin d'être un alias, utilisez plutôt une fonction:

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

Ou un script:

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

Mise à jour, par édition récente

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

Pensez à cette définition de pseudonyme comme à trois chaînes:

  1. Une seule chaîne entre guillemets: 'echo '
  2. Une chaîne sans guillemets: $(date +%k%M)
  3. Une chaîne vide entre guillemets simples: ''
6
wjandrea