2017-09-04 7 views
0

This answer est perspicace mais je suis encore un peu en difficulté.Construire le nom de l'entité en concaténant pwd et string dans l'alias bash

Ce que je veux, c'est créer un alias que je peux utiliser pour sauvegarder une base de données mysql dans un conteneur docker.

Les noms de conteneur sont dans ce cas une concaténation du répertoire de travail et une chaîne de texte: directory_name_1.

La commande que je veux courir (github gist) est la suivante:

docker exec CONTAINER /usr/bin/mysqldump -u root --password=root DATABASE > backup.sql 

qui met le fichier de sauvegarde dans le répertoire de travail.

J'ai essayé

alias dumpdb='docker exec `pwd`_my-string mysqldump -uroot --password=password DATABASE > `pwd`/backup.sql' 

Et variations sur

alias WORKING_DIR="pwd | rev | cut -d "/" -f1 | rev" alias DOCKER_CONTAINER='echo $(WORKING_DIR)_my-wpdb_1' alias dumpdb='docker exec $(DOCKER_CONTAINER) mysqldump -uroot --password=password DATABASE > `pwd`/backup.sql'

Mais je suis toujours là dans piquer le quai. Est-ce que quelqu'un aurait la gentillesse de me guider?

+1

est-il obligatoire d'utiliser un alias? C'est également possible en créant une fonction. –

+0

vous voulez dire comme un script bash, que je pourrais théoriquement créer un alias? Je veux juste rationaliser le processus. – MikeiLL

+0

'> $ (pwd)/backup.sql' est le même que'> ./ backup.sql' qui est le même que '> backup.sql'. Je ne vois pas votre problème concernant l'emplacement de la sauvegarde. – Kusalananda

Répondre

1

Une bonne solution consisterait à utiliser une fonction (et non un alias).

Pourquoi? Parce que les alias sont supposés être utilisés uniquement pour de simples modifications (comme l'ajout d'un argument/indicateur supplémentaire aux commandes). Par conséquent, nous pouvons soit créer une fonction, soit un shellscript. Dans notre cas, puisque c'est un problème assez simple, nous pouvons simplement créer une fonction.

Vous devriez écrire sur .bash_profile

Ainsi, par exemple, vous pouvez essayer de définir la fonction suivante

function dumpdb() 
{ 
    local wkdir="basename $(pwd)" 
    local container="${wkdir}_my-wpdb_1" 
    docker exec ${container} mysqldump -uroot --password=password DATABASE > backup.sql 
} 

Après avoir écrit cela, et rechargeant bash_profile (soit en utilisant .bash_profile source ou créer une nouvelle session) vous serez en mesure d'exécuter dumpdb sur la console comme s'il s'agissait d'un alias.

1
dumpdb() { 
    docker exec "${PWD##*/}_my-wpdb_1" \ 
     mysqldump -uroot --password=password DATABASE >backup.sql 
} 

Ou, comme un alias:

alias dumpdb='docker exec "${PWD##*/}_my-wpdb_1" \ 
    mysqldump -uroot --password=password DATABASE >backup.sql' 

En utilisant une fonction, vous pouvez transmettre le nom de la base de données, par exemple:

dumpdb() { 
    docker exec "${PWD##*/}_my-wpdb_1" \ 
     mysqldump -uroot --password=password "$1" >backup.sql 
} 

dumpdb "my_database" 

${PWD##*/} se dilatent au nom de base de le répertoire de travail parent; si $PWD est /home/user/stuff, alors ${PWD##*/} sera stuff.

Si vous ne spécifiez pas de nom de répertoire pour le fichier vers lequel vous redirigez, le fichier se retrouvera dans le répertoire de travail en cours. L'utilisation de pwd n'est donc pas nécessaire.

+0

Merci. J'ai accepté l'autre réponse parce que c'est arrivé en premier et il semble qu'il pourrait utiliser les points plus que vous. Les deux sont vraiment utiles. J'imagine que l'on pourrait étendre à accepter également $ 2' et '$ 3' et utiliser les instructions' if' pour remplir les variables si les paramètres ne sont pas donnés? – MikeiLL

+1

@MikeiLL Oui, vous pouvez faire à peu près tout ce que vous voulez dans une fonction. – Kusalananda

+0

On dirait que '~/.bashrc' pourrait devenir assez long. Que font généralement les gens s'ils veulent charger différents ensembles de fonctions, alias pour différents flux de travail? – MikeiLL