Passage d'argument dans un alias ?

Bonjour à tous,

Pour plus de confort, j’utilise très souvent la commande ls de cette façon :~$ ls -a -l -p mon_répertoire_cible --color|more -d
J’ai donc créé un alias ll dans ~/.bash_aliases :[code]~$ cat .bash_aliases

ls en couleur affiché page par page

alias ll=‘ls -a -l -p $1 --color | more -d’[/code]sauf que l’argument passé avec l’alias n’est pas pris en compte :[code]~$ ll /media
total 16
drwxr-xr-x 3 user01 user01 1024 21 mai 16:29 ./
drwxr-xr-x 4 root root 1024 13 avril 17:55 …/
drwx------ 2 user01 user01 1024 13 avril 23:07 .aptitude/
-rw-r–r-- 1 user01 user01 83 21 mai 16:29 .bash_aliases
-rw------- 1 user01 user01 1644 21 mai 16:30 .bash_history
-rw-r–r-- 1 user01 user01 220 13 avril 17:55 .bash_logout
-rw-r–r-- 1 user01 user01 3253 13 avril 23:40 .bashrc
-rw-r–r-- 1 user01 user01 3184 13 avril 17:55 .bashrc.old
-rw-r–r-- 1 user01 user01 675 13 avril 17:55 .profile

*** /media: directory ***

~$[/code]Pourtant, je ne vois pas ce qui foire dans mon alias ? :think:

Il y a bien sinon la solution de créer un script ll.sh :[code]~$ cat ll.sh
#! /bin/bash

ls en couleur affiché page par page

ls -a -l -p $1 --color | more -d

exit 0[/code]puis de modifier l’alias :[code]~$ cat .bash_aliases

ls en couleur affiché page par page

alias ll=’/home/user01/ll.sh’[/code]et là, ça fonctionne bien :~$ ll /media total 12 drwxr-xr-x 3 root root 4096 21 mai 13:35 ./ drwxr-xr-x 22 root root 4096 11 déc. 17:09 ../ lrwxrwxrwx 1 root root 6 29 oct. 2011 cdrom -> cdrom0/ drwxr-xr-x 2 root root 4096 29 oct. 2011 cdrom0/ -rw-r--r-- 1 root root 0 21 mai 13:35 .hal-mtab ~$mais je trouve cette solution un peu lourde.

Quelqu’un aurait un petit conseil sur ce coup là, svp ?
Merci à vous…

C’est possible avec tcsh (et probablement ksh et/ou csh), mais pas en bash ni en zsh. Les développeurs de zsh conseillent d’utiliser des fonctions.

Tu voudrais faire ça :

ils te conseillent de faire ça :

function ll { ls -alp --color -- "$@" | more -d }

Tu peux le mettre dans ton bashrc et l’utiliser comme un alias.

Salut,

alias ll='ls -a -l -p $1 --color | more -d'

Avec un espace à la fin pour dire que c’est pas fini :slightly_smiling:

Sinon, un mini-script que tu appelle ‘ll’ :wink:

C’est possible mais un peu plus lourd. Chacun fait son choix. Personnellement en principe quand ça dépasse quelques lignes c’est un script. En dessous ça reste une fonction.

Sachant que le passage de l’un à l’autre c’est rien hein, la fonction :

function nom { # code }
devient le script :

[code]#!/bin/bash # pour avoir exactment le même comportement que la fonction

#code[/code]

Extrait de mon .bashrc :

alias apse='aptitude search ' alias apsh='aptitude show ' alias sha256='jacksum -a sha256 '

Merci les gars pour vos réponses !

Donc en gros, si je comprends bien, il ne semble pas être possible de passer un argument dans un alias… (Je pensais qu’on pouvait aussi le faire sur Linux, comme mentionné ici en Unix)

@ggoodluck47 : au début, j’ai franchement cru à un joke ! :laughing:
J’ai quand même essayé mais ça ne fonctionne pas mieux…

@ricardo : c’est un peu ce que je fais déjà… mais j’aime pas trop enlever l’extension pour les scripts (je trouve que ça ne fait pas propre, mais ça n’engage que moi)

@MisterFreez : merci du tuyau, je ne savais pas qu’on pouvait inclure des fonctions dans bashrc.
Je vais y jetter un oeil ce soir…

Oui enfin là ça n’est pas une différence Linux/Unix dont tu parles, mais bash/csh… :wink:

Sinon, effectivement quand on cherche “bash alias parameter” la réponse dominante semble être celle de MisterFreez (utiliser une fonction). C’est en tous cas la plus élégante à mon avis.

Oui enfin là ça n’est pas une différence Linux/Unix dont tu parles, mais bash/csh… :wink: [/quote]
Les unix utilisant généralement par défaut tcsh ou csh ce n’est pas totalement faux non plus.

C’est aussi la plus puissante.

1 J'aime

Salut,

J’en tire comme conclusion que j’ai des versions spéciales de Debian :laughing: sh ==> dash ?

Je n’ai rien compris à ton message sur les espaces à la fin ?

Re,

En insérant un espace en fin de définition cela donne :

$ apse headers pour rechercher les “headers” :slightly_smiling:

L’espace en fin ne change de toute manière rien.

alias apse='aptitude search ' apse headers
fonctionne aussi bien que :

alias apse='aptitude search' apse headers
Testé avec dash, bash, zsh et tcsh.

Re,

J’appliquais cette méthode pour l’avoir lu et sans chercher plus loin :blush:

J’ai potassé un peu les fonctions en Bash (notamment grâce à ce site pour ceux que ça intéresserait) et, comme conseillé par MisterFreez, j’ai remplacé mon script + alias en fonction “ll” : ll () { ls -a -l -p $1 --color|more -d } ça marche nickel :smiley:

Merci à tous pour votre aide !
A+

Petite remarque…
Ça donne quoi si tu fais ll “chemin avec des espaces dedans” ? :mrgreen:
Et si tu fais ll chemin1 chemin2 ? (c’est une utilisation tout à fait valide de ls)

Pour résoudre ces deux problèmes :

  • passer l’argument --color avant le(s) chemin(s), ça évitera la confusion si tu spécifies plusieurs chemins
  • mettre des guillemets autour de $1 ça permettrait d’éviter le premier problème (sans aucun doute le plus courant)
  • le deuxième problème pourrait être résolu en remplaçant $1 par “$@” (recopier tous les arguments au lieu seulement du premier), et accessoirement ça résout aussi le premier problème en même temps

ll () { ls -a -l -p --color "$@" |more -d }
:wink:

Avec un peu de retard, certes mais merci syam pour ta dernière astuce ! (et en plus j’ai appris qu’on pouvait passer plusieurs arguments à ls)

:clap: