[Lugge] Re: which

  • From: "Zingus J. Rinkle" <1999s039@xxxxxxxxxxxxxxxxxx>
  • To: lugge@xxxxxxxxxxxxx
  • Date: Sun, 21 Apr 2002 18:30:37 +0200

On Sun, Apr 21, 2002 at 04:46:32PM +0200, Lo'oRiS il Kabukimono wrote:
> non son buono con gli script, quindi chiedo a voi...
> e non son buono a spiegare, quindi vado subito di esempio...
 
> ricordo che tempo fa, sotto redhat:
> looris@lano$ which ll
> alias ll='ls -l'

>adesso, con woody: 

>looris@lano:~? which ll
>looris@lano:~? cat /usr/bin/which

Analizziamo il tuo /usr/bin/which:
 
> #!/bin/bash
# elimina tutti gli alias...
> unalias -a
# elimina tutte le variabili e le funzioni col nome dei comandi in argomento... 
                
> unset -- "$@" &> /dev/null
# disabilita tutti gli shell builtins col nome dei comandi in argomento...      
> enable -n -- "$@" &> /dev/null        
# ritorna il giudizio della shell sui comandi in argomento...
> type -p "$@"                           

Quindi mi ritorna qualcosa solo se il nome si riferisce ad un file...

> quindi qualcuno mi può passare una versione di which che becchi anche
> gli alias?

Se vogliamo conservare lo stile della redhat (o almeno quello ch'io ritengo
possa essere, non avendo sottomano una redhat...), questo script dovrebbe
farlo...

function which () {
        for arg ; do
                case `type -t -- "$arg"` in
                file)
                        type -p "$arg"
                ;;
                alias)
                        echo -n "alias $arg=\""
                        type "$arg" | sed "s/^[^\`]*\`// ; s/'$/\"/"
                ;;
                function)
                        type "$arg" | tail +2
                ;; 
                keyword|builtin)
                        echo "$arg"
                esac
        done
}

Va salvato in un file, questo file deve essere "sourced", ovvero se il file
si chiama "pippo.sh":
        . pippo.sh

A questo punto puoi chiamare:
        which ll

A meno che which non sia un alias, allora:
        unalias which

Oppure si puo' salvare lo script in fondo a .bashrc, magari precedendolo
con un opportuno "unalias which"
(gli alias hanno priorita' maggiore delle funzioni, per bash)

Uno script tout-court, volendo identificare gli alias e/o le funzioni
NON e' consigliabile, proprio per niente, dato che questi vengono
inizializzati in ~/.bashrc, e gli script con l'header "#!/bin/bash"
NON lo leggono... Alternativamente l'header "#!/bin/bash -i" fa il lavoro,
ma inizializza una nuova shell interattiva, cosa che generalmente non e'
desiderabile... (e.g. se facciamo strane cose nel .bashrc)

Il prob. e' che se vogliamo basare degli altri script su questo nuovo "which"
NON lo possiamo fare, a meno di non chiamare pure questo con bash -i ...
(o di scrivere delle altre funzioni, non degli eseguibili)

/usr/bin/which comunque (per definizione) NON dovrebbe ritornare alcunche'
sugli alias, e mi sembra abbastanza eretico implementarlo con lo script
che usa la debian... Assumendo di avere bash installato e' comprensibile,
ma di solito e' un compilato (almeno sul mio sys e' cosi'...)

In conclusione, fossi in te userei "type", e' un comando della bash,
e ritorna un po' tutto quel che ti serve: sia lo script della debian
che il mio si basano su di esso... ("help type" for more :-) )

E cosi' anche 'sto pomeriggio mi sono esercitato su bash...
                ...la mia droga preferita...
f.to ZJR
-- 
__________   __________ +--------------------------------------------+
\____     \ /     ____/ | ZJR stands for Zingus J. Rinkle            |
 \___     ZJR     ___/  | (what the J. stands for, no one can tell)  |
  \_______/ \_______/   | zingusrinkle at iname.com                  |
http://www.as1.da.ru    +--------------------------------------------+

<========----------
 Prima di scrivere in m-list per favore leggi il regolamento
 http://lugge.ziobudda.net/soci/manifesto.htm#list

 Archivio delle e-mail postate in lista
 //www.freelists.org/archives/lugge/

----------========>
 Incontri in sede: martedì 15:00-18:00 e sabato 9:30-12.30
 

Other related posts: