1821 votes

Créer un alias Bash qui prend un paramètre ?

J'avais l'habitude d'utiliser CShell ( csh ), qui vous permet de créer un alias qui prend un paramètre. La notation était quelque chose comme

alias junk="mv \\!* ~/.Trash"

Dans Bash, cela ne semble pas fonctionner. Étant donné que Bash possède une multitude de fonctionnalités utiles, je suppose que celle-ci a été implémentée, mais je me demande comment.

3 votes

3 votes

Assurez-vous que vous utilisez des guillemets autour des args "$1"

1 votes

Cette question est hors sujet pour l'OS. Elle a été répondu sur UNIX.SE et la réponse est que vous n'avez même pas besoin de vous en soucier : "Par exemple, si vous deviez aliaser ls a ls -la puis en tapant ls foo bar serait vraiment exécuter ls -la foo bar sur la ligne de commande".

14voto

Nathaniel Points 245

Respectueusement à tous ceux qui disent que vous ne pouvez pas insérer un paramètre au milieu d'un alias, je viens de le tester et j'ai constaté que cela fonctionne.

alias mycommand = "python3 "$1" script.py --folderoutput RESULTS/"

lorsque j'ai ensuite exécuté mycommand foobar, cela a fonctionné exactement comme si j'avais tapé la commande à la main.

11voto

osirisgothra Points 368

NB : Au cas où l'idée ne serait pas évidente, c'est une mauvaise idée d'utiliser des alias pour autre chose que des alias, le premier étant la "fonction dans un alias" et le second étant la "redirection/source difficile à lire". En outre, il existe des défauts (que je pensée serait évident, mais juste au cas où vous seriez confus : je ne veux pas qu'ils soient utilisés... nulle part !)

................................................................................................................................................

J'ai déjà répondu à cette question, et c'était toujours comme ça dans le passé :

alias foo='__foo() { unset -f $0; echo "arg1 for foo=$1"; }; __foo()'

ce qui est très bien, à moins que vous n'évitiez complètement l'utilisation de fonctions. Dans ce cas, vous pouvez profiter de la grande capacité de bash à rediriger le texte :

alias bar='cat <<< '\''echo arg1 for bar=$1'\'' | source /dev/stdin'

Ils sont tous deux de la même longueur, à quelques caractères près.

El réel L'élément déterminant est la différence de temps, le haut étant la "méthode de la fonction" et le bas la "méthode de la source redirigée". Pour prouver cette théorie, le timing parle de lui-même :

arg1 for foo=FOOVALUE
 real 0m0.011s user 0m0.004s sys 0m0.008s  # <--time spent in foo
 real 0m0.000s user 0m0.000s sys 0m0.000s  # <--time spent in bar
arg1 for bar=BARVALUE
ubuntu@localhost /usr/bin# time foo FOOVALUE; time bar BARVALUE
arg1 for foo=FOOVALUE
 real 0m0.010s user 0m0.004s sys 0m0.004s
 real 0m0.000s user 0m0.000s sys 0m0.000s
arg1 for bar=BARVALUE
ubuntu@localhost /usr/bin# time foo FOOVALUE; time bar BARVALUE
arg1 for foo=FOOVALUE
 real 0m0.011s user 0m0.000s sys 0m0.012s
 real 0m0.000s user 0m0.000s sys 0m0.000s
arg1 for bar=BARVALUE
ubuntu@localhost /usr/bin# time foo FOOVALUE; time bar BARVALUE
arg1 for foo=FOOVALUE
 real 0m0.012s user 0m0.004s sys 0m0.004s
 real 0m0.000s user 0m0.000s sys 0m0.000s
arg1 for bar=BARVALUE
ubuntu@localhost /usr/bin# time foo FOOVALUE; time bar BARVALUE
arg1 for foo=FOOVALUE
 real 0m0.010s user 0m0.008s sys 0m0.004s
 real 0m0.000s user 0m0.000s sys 0m0.000s
arg1 for bar=BARVALUE

Il s'agit de la partie inférieure d'environ 200 résultats, obtenus à des intervalles aléatoires. Il semble que la création/destruction de fonctions prenne plus de temps que la redirection. J'espère que cela aidera les futurs visiteurs à répondre à cette question (je ne voulais pas la garder pour moi).

9voto

Micah Points 2587

Si vous cherchez un moyen générique d'appliquer tous les paramètres à une fonction, et pas seulement un ou deux ou une autre quantité codée en dur, vous pouvez le faire de cette façon :

#!/usr/bin/env bash

# you would want to `source` this file, maybe in your .bash_profile?
function runjar_fn(){
    java -jar myjar.jar "$@";
}

alias runjar=runjar_fn;

Ainsi, dans l'exemple ci-dessus, je passe tous les paramètres de l'exécution de la fonction runjar à l'alias.

Par exemple, si je faisais runjar hi there il finirait par fonctionner java -jar myjar.jar hi there . Si je l'ai fait runjar one two three il fonctionnerait java -jar myjar.jar one two three .

J'aime ça. $@ - car elle fonctionne avec un nombre illimité de paramètres.

7voto

William Martens Points 366

Je vais simplement poster ma solution (en espérant qu'elle soit correcte) (pour les futurs lecteurs et, surtout, les éditeurs).
Veuillez donc modifier et améliorer/supprimer tout ce qui figure dans ce message.

Dans le terminal :

$ alias <name_of_your_alias>_$argname="<command> $argname"

et de l'utiliser (remarquez l'espace après '_') :

$<name_of_your_alias>_ $argname

par exemple, un alias pour cat un fichier appelé hello.txt :

  • (le nom d'alias est CAT_FILE_ )
  • et le $f (c'est le $argname (qui est un fichier dans cet exemple)

    $ alias CATFILE$f="cat $f"

    $ echo " " >> hello.txt $ echo "hello there!" >> hello.txt $ echo " " >> hello.txt $ cat hello.txt

    hello there!

Test (remarquez l'espace après '_') :

CAT_FILE_ hello.txt

6voto

Anton Abrosimov Points 131

Solution avec sous-commandes :

d () {
    if [ $# -eq 0 ] ; then
        docker
        return 0
    fi
    CMD=$1
    shift

    case $CMD in
    p)
        docker ps --all $@
        ;;
    r)
        docker run --interactive --tty $@
        ;;
    rma)
        docker container prune
        docker image prune --filter "dangling=true"
        ;;
    *)
        docker $CMD $@
        ;;
    esac
    return $?
}

Utilisation :

$ d r my_image ...

Appelé :

docker run --interactive --tty my_image ...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X