J’utilise ZSH pour mon terminal de terminal et, bien que j’aie écrit plusieurs fonctions pour automatiser des tâches spécifiques, je n’ai jamais vraiment tenté quoi que ce soit qui nécessite les fonctionnalités dont je dispose pour le moment.
J’ai récemment réécrit un blog en utilisant Jekyll et je veux automatiser la production des articles de blog et enfin le téléchargement des fichiers nouvellement produits sur mon serveur en utilisant quelque chose comme scp.
Je suis un peu confus au sujet des liaisons variables / utilisation dans ZSH; par exemple:
DATE= date +'20%y-%m-%d' echo $DATE
produit correctement le 2011-08-23 comme je l’espérais.
Mais quand j’essaye:
DATE= date +'20%y-%m-%d' FILE= "~/path/to/_posts/$DATE-$1.markdown" echo $FILE
Il produit:
2011-08-23 blog.sh: line 4: ~/path/to/_posts/-.markdown: No such file or directory
Et lorsqu’il est exécuté avec ce que je voudrais que le titre du blog soit (en ignorant le fait que la chaîne doit être manipulée pour la rendre plus conviviale et que le chemin d’access / to n’existe pas)
c’est-à-dire blog “titre du blog”, sorties:
2011-08-23 blog.sh: line 4: ~/path/to/_posts/-blog title.markdown: No such file or directory
Pourquoi $ DATE imprime-t-il au-dessus de l’appel pour imprimer $ FILE plutôt que la chaîne incluse dans $ FILE?
Deux choses se passent mal ici.
Premièrement, votre premier extrait ne fait pas ce que je pense que vous pensez. Essayez de supprimer la deuxième ligne, l’ echo
. Il imprime toujours la date, non? Car ce:
DATE= date +'20%y-%m-%d'
N’est pas une affectation de variable – c’est une invocation de date
avec une variable d’environnement auxiliaire (la syntaxe générale est VAR_NAME=VAR_VALUE COMMAND
). Tu veux dire ça:
DATE=$(date +'20%y-%m-%d')
Votre deuxième extrait échouera toujours, mais différemment. Encore une fois, vous utilisez la syntaxe invoke-with-environment au lieu de l’affectation. Vous voulez dire:
# note the lack of a space after the equals sign FILE="~/path/to/_posts/$DATE-$1.markdown"
Je pense que ça devrait faire l’affaire.
Disclaimer: bien que je sache très bien, j’ai seulement commencé à utiliser zsh récemment; il y a peut-être des zshisms au travail ici que je ne connais pas.
En savoir plus sur ce qu’un shell appelle «l’expansion». Il existe plusieurs types, exécutés dans un ordre particulier:
L’ordre d’expansion des mots est le suivant:
set -f
est en vigueur Notez que l’extension tilde n’est effectuée que lorsque le tilde n’est pas cité. à savoir:
$ FILE="~/.zshrc" $ echo $FILE ~/.zshrc $ FILE=~./zshrc $ echo $FILE /home/user42/.zshrc
Et il ne doit y avoir aucun espace autour des affectations de variables =
.
Comme vous avez demandé dans un commentaire où apprendre la programmation shell, il y a plusieurs options:
man zsh