J'utilisais CShell (csh), qui vous permet de créer un alias qui accepte 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.
"$1"
ls
àls -la
, puis en tapantls foo bar
serait vraiment exécuterls -la foo bar
sur la ligne de commande. »alias test_args="echo PREFIX --$1-- SUFFIX"
, qui lorsqu'elle est appelée avectest_args ABCD
donne la sortie de console suivantePREFIX ---- SUFFIX ABCD
Réponses:
L'alias Bash n'accepte pas directement les paramètres. Vous devrez créer une fonction.
alias
n'accepte pas les paramètres mais une fonction peut être appelée comme un alias. Par exemple:Soit dit en passant, les fonctions Bash définies dans vos
.bashrc
fichiers et dans d'autres sont disponibles sous forme de commandes dans votre shell. Ainsi, par exemple, vous pouvez appeler la fonction précédente comme celle-cila source
$1
entre guillemets?source
votre .bashrc ajoutera la fonction mais ne désaliasera pas l'ancien alias. Étant donné que les alias ont un précédent plus élevé que les fonctions, il essaiera d'utiliser l'alias. Vous devez soit fermer et rouvrir votre shell, soit appelerunalias <name>
. Je sauverai peut-être quelqu'un les 5 minutes que je viens de perdre.exec bash
: il va démarrer un nouveau shell, vous donnant une lecture claire de vos configurations, comme si vous fermiez et rouvriez, mais en gardant aussi les paramètres des variables d'environnement de cette session . En outre, l'exécutionbash
sans l'exec peut être utile lorsque vous souhaitez gérer pense comme une pile.mv "$1" "$1.bak"
. sans guillemets, si $ 1 était "hello world", vous l'exécuteriez à lamv hello world hello world.bak
place demv "hello world" "hello world.bak"
.En affinant la réponse ci-dessus, vous pouvez obtenir la syntaxe d'une ligne comme vous le pouvez pour les alias, ce qui est plus pratique pour les définitions ad hoc dans un shell ou des fichiers .bashrc:
N'oubliez pas le point-virgule avant le crochet de fermeture de droite. De même, pour la vraie question:
Ou:
la source
mv "$1" "$1.bak"; cp "$2" "$1"
àmv "$1" "$1.bak" && cp "$2" "$1"
pour ne pas perdre vos donnéesmv
en cas de problème (par exemple, système de fichiers plein).La question est simplement mal posée. Vous ne créez pas d'alias qui accepte des paramètres car il
alias
suffit d'ajouter un deuxième nom pour quelque chose qui existe déjà. La fonctionnalité souhaitée par l'OP est lafunction
commande pour créer une nouvelle fonction. Vous n'avez pas besoin d'alias la fonction car la fonction a déjà un nom.Je pense que vous voulez quelque chose comme ça:
C'est ça! Vous pouvez utiliser les paramètres $ 1, $ 2, $ 3, etc., ou tout simplement les remplir avec $ @
la source
echo -e '#!/bin/bash\nshopt -s expand_aliases\nalias asrc='\''echo "${BASH_SOURCE[0]}"'\'' # note the '\''s\nfunction fsrc(){ echo "${BASH_SOURCE[0]}";}'>>file2&&echo -e '#!/bin/bash\n. file2\nalias rl='\''readlink -f'\''\nrl $(asrc)\nrl $(fsrc)'>>file1&&chmod +x file1&&./file1;rm -f file1 file2
$@
pour prendre en charge les noms de fichiers avec des espaces, etc.TL; DR: faites ceci à la place
Il est beaucoup plus facile et plus lisible d'utiliser une fonction qu'un alias pour placer des arguments au milieu d'une commande.
Si vous continuez à lire, vous apprendrez des choses que vous n'avez pas besoin de savoir sur le traitement des arguments du shell. La connaissance est dangereuse. Obtenez juste le résultat que vous voulez, avant que le côté obscur ne contrôle à jamais votre destin.
Clarification
bash
alias n'acceptent des arguments, mais seulement à la fin :Mettre des arguments au milieu de la commande via
alias
est en effet possible mais cela devient moche.N'essayez pas cela à la maison, les enfants!
Si vous aimez contourner les limitations et faire ce que les autres disent est impossible, voici la recette. Ne me blâmez pas si vos cheveux se frottent et que votre visage finit par être couvert de suie.
La solution de contournement consiste à passer les arguments qui
alias
n'acceptent qu'à la fin à un wrapper qui les insérera au milieu, puis exécutera votre commande.Solution 1
Si vous êtes vraiment contre l'utilisation d'une fonction en soi, vous pouvez utiliser:
Vous pouvez remplacer
$@
par$1
si vous ne voulez que le premier argument.Explication 1
Cela crée une fonction temporaire
f
, à laquelle sont passés les arguments (remarque quif
est appelée à la toute fin). Leunset -f
supprime la définition de la fonction à mesure que l'alias est exécuté afin qu'il ne reste pas après.Solution 2
Vous pouvez également utiliser un sous-shell:
Explication 2
L'alias crée une commande comme:
Commentaires:
L'espace réservé
_
est obligatoire, mais il peut s'agir de n'importe quoi. Il est défini sursh
's'$0
et est requis pour que le premier des arguments donnés par l'utilisateur ne soit pas consommé. Manifestation:Les guillemets simples à l'intérieur des guillemets simples sont obligatoires. Voici un exemple de non fonctionnement avec des guillemets doubles:
Ici, les valeurs de l'interpréteur de commandes interactif
$0
et$@
sont remplacées par le double entre guillemets avant d' être passées àsh
. Voici la preuve:Les guillemets simples garantissent que ces variables ne sont pas interprétées par un shell interactif et sont transmises littéralement à
sh -c
.Vous pouvez utiliser des guillemets doubles et
\$@
, mais la meilleure pratique consiste à citer vos arguments (car ils peuvent contenir des espaces), et\"\$@\"
semble encore plus laid, mais peut vous aider à gagner un concours d'obscurcissement où les cheveux ébouriffés sont une condition préalable à la participation.la source
alias gc='git checkout'
$@
? Ils sont nécessaires si vous avez, par exemple, des fichiers contenant des espaces.Une autre solution consiste à utiliser le marqueur , un outil que j'ai créé récemment qui vous permet de "mettre en signet" des modèles de commandes et de placer facilement le curseur sur les emplacements de commande:
J'ai constaté que la plupart du temps, j'utilise des fonctions shell, donc je n'ai pas à écrire encore et encore des commandes fréquemment utilisées dans la ligne de commande. Le problème de l'utilisation des fonctions pour ce cas d'utilisation est l'ajout de nouveaux termes à mon vocabulaire de commande et le fait de devoir se souvenir des fonctions auxquelles les paramètres font référence dans la commande réelle. L'objectif principal est d'éliminer ce fardeau mental.
la source
Tout ce que vous avez à faire est de créer une fonction à l'intérieur d'un alias:
Vous devez mettre des guillemets doubles autour de "$ 1" car les guillemets simples ne fonctionneront pas.
la source
bash: syntax error near unexpected token '{mkdir'
.;
à l'intérieur de la fonction_mkcd
.{
et}
Voici trois exemples de fonctions que j'ai dans my
~/.bashrc
, qui sont essentiellement des alias qui acceptent un paramètre:.
.
.
Références:
la source
L'alias Bash accepte absolument les paramètres. Je viens d'ajouter un alias pour créer une nouvelle application React qui accepte le nom de l'application comme paramètre. Voici mon processus:
Ouvrez le bash_profile pour le modifier dans nano
Ajoutez vos alias, un par ligne:
Enregistrer et quitter l'éditeur nano
Dites au terminal d'utiliser les nouveaux alias dans .bash_profile
C'est ça! Vous pouvez maintenant utiliser vos nouveaux alias
la source
NB: Dans le cas où l'idée n'est 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 ''. De plus, il y a des défauts (que je pensais être évidents, mais juste au cas où vous seriez confus: je ne veux pas qu'ils soient réellement utilisés ... n'importe où!)
.................................................. .................................................. ............................................
J'ai déjà répondu à cela, et cela a toujours été comme ça dans le passé:
ce qui est bien et bon, sauf si vous évitez d'utiliser toutes les fonctions ensemble. dans ce cas, vous pouvez profiter de la grande capacité de bash à rediriger le texte:
Ils sont tous les deux de la même longueur, donnent ou prennent quelques caractères.
Le vrai kicker est la différence de temps, le haut étant la «méthode de fonction» et le bas étant la méthode de «redirection-source». Pour prouver cette théorie, le timing parle de lui-même:
Il s'agit de la partie inférieure d'environ 200 résultats, effectués à 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 à cette question (je ne voulais pas la garder pour moi).
la source
time for i in {1..1000}; do foo FOOVALUE; done
→ 0m0.028s. Maistime for i in {1..1000}; do bar FOOVALUE; done
→ 0m2.739s. Bar est deux ordres de grandeur plus lent que foo. Le simple fait d'utiliser une fonction simple au lieu d'un alias réduit le temps d'exécution de 30% supplémentaires :function boo() { echo "arg1 for boo=$1" ; }
⇒time for i in {1..1000}; do boo FOOVALUE; done
→ 0m0.019s.Si vous cherchez un moyen générique d'appliquer tous les paramètres à une fonction, pas seulement un ou deux ou une autre quantité codée en dur, vous pouvez le faire de cette façon:
Donc, dans l'exemple ci-dessus, je passe tous les paramètres à partir du moment où je cours
runjar
vers l'alias.Par exemple, si je le faisais,
runjar hi there
cela finirait par fonctionnerjava -jar myjar.jar hi there
. Si je le faisais,runjar one two three
ça iraitjava -jar myjar.jar one two three
.J'aime cette
$@
solution basée sur le fait qu'elle fonctionne avec n'importe quel nombre de paramètres.la source
runjar
au lieu d'en faire un alias d'une fonction? Semble inutilement compliqué!alias
-ed (ou ayant les propriétés des choses transmisesalias
) dans les fichiers bash? si oui, alors c'est juste que je ne l'ai pas sualias runjar='java -jar myjar.jar'
. Les alias acceptent les arguments, mais uniquement à la fin.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 fonctionnait.
alias mycommand = "python3" $ 1 "script.py --folderoutput RESULTS /"
lorsque j'ai ensuite exécuté ma commande foobar, cela a fonctionné exactement comme si j'avais tapé la commande à la main.
la source
alias myalias="echo 1 "$1" 3"; myalias 2
donne:1 3 2
Il existe des raisons techniques légitimes de vouloir une solution généralisée au problème de l'alias bash n'ayant pas de mécanisme pour prendre un repositionnement des arguments arbitraires. L'une des raisons est que la commande que vous souhaitez exécuter serait affectée par les modifications de l'environnement résultant de l'exécution d'une fonction. Dans tous les autres cas, les fonctions doivent être utilisées.
Ce qui m'a récemment poussé à essayer une solution, c'est que je voulais créer des commandes abrégées pour imprimer les définitions des variables et des fonctions. J'ai donc écrit quelques fonctions à cet effet. Cependant, certaines variables sont (ou peuvent être) modifiées par un appel de fonction lui-même. Parmi eux:
FUNCNAME BASH_SOURCE BASH_LINENO BASH_ARGC BASH_ARGV
La commande de base que j'utilisais (dans une fonction) pour imprimer des defns variables. sous la forme sortie par la commande set était:
Par exemple:
Problème: cela n'imprimera pas les définitions des variables mentionnées ci-dessus car elles sont dans le contexte actuel , par exemple, si dans une invite de shell interactive (ou pas dans les appels de fonction), FUNCNAME n'est pas défini. Mais ma fonction me dit la mauvaise information:
Une solution que j'ai trouvée a été mentionnée par d'autres dans d'autres articles sur ce sujet. Pour cette commande spécifique pour imprimer les définitions de variables., Et qui ne nécessite qu'un seul argument, j'ai fait ceci:
Ce qui donne la sortie correcte (aucune) et l'état du résultat (faux):
Cependant, je me sentais toujours obligé de trouver une solution qui fonctionne pour un nombre arbitraire d'arguments.
Une solution générale pour passer des arguments arbitraires à une commande alias Bash:
Par exemple:
Une bonne chose à propos de cette solution est que toutes les astuces spéciales utilisées pour gérer les paramètres de position (arguments) des commandes fonctionneront lors de la composition de la commande capturée. La seule différence est que la syntaxe du tableau doit être utilisée.
Par exemple,
Si vous voulez "$ @", utilisez "$ {CMD_ARGV [@]}".
Si vous voulez "$ #", utilisez "$ {# CMD_ARGV [@]}".
Etc.
la source
Une fois que j'ai fait un projet amusant et je l'utilise toujours. Cela montre de l'animation alors que je copie des fichiers via la
cp
commande cozcp
ne montre rien et c'est un peu frustrant. J'ai donc fait cet aliasEt c'est le script spiner
C'est comme ça
Animation à vélo)
la source
Pour prendre des paramètres, vous devez utiliser des fonctions!
Cependant $ @ est interprété lors de la création de l'alias au lieu de pendant l'exécution de l'alias et l'échappement de $ ne fonctionne pas non plus. Comment résoudre ce problème?
Vous devez utiliser la fonction shell au lieu d'un alias pour vous débarrasser de ce problème. Vous pouvez définir foo comme suit:
OU
Enfin, appelez votre foo () en utilisant la syntaxe suivante:
Assurez-vous d'ajouter votre foo () à
~/.bash_profile
ou~/.zshrc
fichier.Dans votre cas, cela fonctionnera
la source
Les fonctions sont en effet presque toujours la réponse comme déjà largement contribué et confirmé par cette citation de la page de manuel: "Pour presque tous les usages, les alias sont remplacés par les fonctions shell."
Pour être complet et parce que cela peut être utile (syntaxe légèrement plus légère), on peut noter que lorsque le ou les paramètres suivent l'alias, ils peuvent toujours être utilisés (bien que cela ne répondrait pas aux exigences de l'OP). C'est probablement plus facile à démontrer avec un exemple:
me permet de taper smth like
ssh_disc myhost
, qui est développé comme prévu:ssh -O stop myhost
Cela peut être utile pour les commandes qui prennent des arguments complexes (ma mémoire n'est plus ce qu'elle est ...)
la source
Les fonctions et les alias peuvent utiliser des paramètres comme d'autres l'ont montré ici. De plus, je voudrais souligner quelques autres aspects:
1. la fonction s'exécute dans sa propre portée, alias partage la portée
Il peut être utile de connaître cette différence dans les cas où vous devez cacher ou exposer quelque chose. Cela suggère également qu'une fonction est le meilleur choix pour l'encapsulation.
Production:
2. le script wrapper est un meilleur choix
Il m'est arrivé plusieurs fois qu'un alias ou une fonction ne soit pas trouvé lors de la connexion via
ssh
ou impliquant la commutation de noms d'utilisateurs ou d'un environnement multi-utilisateurs. Il y a des trucs et astuces avec le sourcing de fichiers dot, ou celui-ci avec l'alias: permet à cet alias suivant de fonctionner comme prévu (notez l'espace supplémentaire dedans ). Cependant, un script wrapper fonctionne mieux qu'une fonction ou un alias dans des cas comme celui-ci. Le principal avantage d'un script wrapper est qu'il est visible / exécutable pour le chemin prévu (c'est-à-dire / usr / loca / bin /) où en tant que fonction / alias doit être obtenu avant de pouvoir être utilisé. Par exemple, vous placez une fonction dans un ~ / .bash_profile ou ~ / .bashrc pour , mais passez ensuite à un autre shell (c'est-à-dire ) alors la fonction n'est plus visible. Ainsi, en cas de doute, un script wrapper est toujours la solution la plus fiable et portable.alias sd='sudo '
alias install='sd apt-get install'
sd='sudo '
bash
zsh
la source
source
dans une fonction fonctionne très bien.f () { source /tmp/nst; }
fait exactement ce que j'attends. Peut-être que vous avezPATH
tort, alors ça tourne malactivate
ou quelque chose; mais l'exécutionsource
d'une fonction fonctionne très bien.function
mot - clé dans votre définition, voir wiki.bash-hackers.org/scripting/obsolete -function funcname {
est une ancienne syntaxe ksh prise en charge par bash pour une compatibilité descendante avec les shells pré-POSIX, alors quefuncname() {
c'est une syntaxe officielle standardisée POSIX.function funcname() {
est une incompatibilité des deux qui n'est pas compatible avec l'ancien ksh ou compatible avec POSIX sh, et qu'il est donc préférable d'éviter.Voici l'exemple:
Très important:
{
et avant}
.;
après chaque commande dans l'ordre. Si vous oubliez cela après la dernière commande, vous verrez à>
la place une invite!"$1"
la source
Comme cela a déjà été souligné par d'autres, l'utilisation d'une fonction doit être considérée comme la meilleure pratique.
Cependant, voici une autre approche, en tirant parti
xargs
:Notez que cela a des effets secondaires concernant la redirection des flux.
la source
Vous n'avez rien à faire, alias le fait automatiquement.
Par exemple, si je veux paramétrer git pull origin master, je peux simplement créer un alias comme suit:
et lorsque vous l'appelez, vous pouvez passer 'master' (le nom de la branche) comme paramètre, comme ceci:
la source