Puis-je écrire un alias qui prend une dispute?

J’ai des machines distantes, où j’ai besoin de comstackr du code source. Ce que je fais normalement est d’écrire un alias, qui dit quelque chose comme:

alias g++='g++ `pkg-config --cflags opencv --libs opencv`' 

Ensuite, quand je vais comstackr à distance, je ferais g++ -o test test.cpp .

Pour une raison quelconque, Ubuntu ne me laissera pas faire cela. Au lieu de cela, Ubuntu fonctionne, quand je le fais:

 g++ file.cpp -o file `pkg-config --cflags opencv --libs opencv` 

Mais cela signifie que je ne peux pas écrire un alias pour g ++. Existe-t-il un moyen de rédiger un alias prenant un argument? que devrais-je faire?

TL; DR: Utilisez la command g++ dans une fonction shell au lieu de g++ dans un alias.

Comme 6.6 Alias dans le manuel de référence de Bash dit:

Il n’y a pas de mécanisme pour utiliser des arguments dans le texte de remplacement, comme dans csh . Si des arguments sont nécessaires, une fonction shell doit être utilisée (voir Fonctions du shell ).

Bien qu’un alias se développe même lorsqu’il apparaît devant du texte supplémentaire, les alias ne prennent pas en charge les parameters de position (c’est-à-dire les arguments de ligne de commande ). Vous ne pouvez donc pas utiliser d’alias pour exécuter votre tâche actuelle. Autrement dit, vous ne pouvez pas utiliser un alias pour exécuter une commande avec des arguments spécifiés par l’utilisateur suivis par des arguments supplémentaires.

Comme vous l’avez constaté, vous pouvez utiliser un alias pour exécuter le g++ file.cpp -o file :

 g++ `pkg-config --cflags opencv --libs opencv` file.cpp -o file 

Mais pour ne pas créer de g++ file.cpp -o file exécutez cette commande:

 g++ file.cpp -o file `pkg-config --cflags opencv --libs opencv` 

Donc, si vous le souhaitez, vous voudrez probablement utiliser une fonction shell :

 g++ () { command g++ `pkg-config --cflags opencv --libs opencv` "$@" } 

Vous pouvez:

  • Exécutez-le sur la ligne de commande et il sera défini tant que le shell actuel est en cours d’exécution, uniquement dans cette instance de shell, ou
  • ajoutez-le à votre fichier ~/.bashrc et démarrez un nouveau shell ou exécutez-le . ~/.bashrc . ~/.bashrc .

Ceci définit une fonction appelée g++ . Etant donné que, contrairement aux alias, les fonctions peuvent s’appeler par elles-mêmes, j’ai utilisé la command intégrée pour empêcher une récursivité indésirable. command g++ appelle la commande externe g++ . "$@" développe à tous les arguments de ligne de commande passés à la fonction.

Dans le cas très rare où g++ devait vraiment être un alias, vous pouvez “sortingcher” et le définir en tant qu’alias d’une fonction (tout comme vous pouvez définir un alias pour toute autre commande). Vous pouvez le faire en définissant d’abord la fonction ou en la définissant à chaque fois dans l’alias (comme le suggère George ). Cependant, vous n’avez pas besoin de le faire; une fonction fonctionnera bien.

Bien sûr, vous ne voudrez peut-être pas toujours que g++ pkg-config --cflags opencv --libs opencv la sortie de pkg-config --cflags opencv --libs opencv . Donc, vous voudrez peut-être mettre la définition d’alias dans un fichier et le générer uniquement quand vous le souhaitez. Si votre définition se trouve dans g++-fn.sh dans votre répertoire personnel, activez cette fonction pour pouvoir exécuter:

 . ~/g++-fn.sh 

Et pour désactiver la fonction (quelle que soit sa définition), vous pouvez exécuter:

 unset -f g++ 

Je devrais append que, pour tous les programmes sauf minuscules ou autrement sortingviaux, vous devriez au moins envisager d’utiliser make (au lieu d’invoquer g++ vous-même avec le résultat de pkg-config chaque fois), comme l’ a suggéré Steeldriver .

Puis quand je vais comstackr à distance

C’est ton problème principal. Les alias définis dans un fichier de configuration local ou un shell interactif local ne fonctionneront pas sur un système distant. Définissez l’alias dans ~/.bashrc votre machine distante et il fonctionnera ensuite.

Une meilleure approche serait de définir une fonction, comme suggéré par Eliah. Mais vous devrez toujours le définir sur la machine distante, comme avec un alias.