È possibile verificare dove è stato definito un alias?


24

Un alias, ad esempio lldefinito con il aliascomando.

Posso controllare il comando con cose come type llquali stampe

ll is aliased to `ls -l --color=auto'

o command -v llquale stampa

alias ll='ls -l --color=auto'

o alias llche stampa anche

alias ll='ls -l --color=auto'

ma non riesco a trovare dove è stato definito l'alias, cioè un file come .bashrc, o forse manualmente nella shell in esecuzione. A questo punto non sono sicuro che ciò sia possibile.

Devo semplicemente esaminare tutti i file che sono caricati bashe controllare ognuno di essi?


Vado fuori dal bracciale direi di correrebash -xl
Jeff Schaller

Risposte:


21

La definizione manuale sarà difficile da individuare (i registri della cronologia, forse) anche se si chiede alla shell di mostrare cosa sta facendo e quindi grepdovrebbe aiutare a trovare quelli impostati in un file rc:

bash -ixlc : 2>&1 | grep ...
zsh -ixc : 2>&1 | grep ...

Se la shell non sta acquisendo con precisione le opzioni necessarie con una delle invocazioni sopra (che eseguono in modo interattivo il comando null), allora script:

script somethingtogrep thatstrangeshell -x
...
grep ... somethingtogrep

Un'altra opzione sarebbe quella di usare qualcosa di simile straceo sysdigdi trovare tutti i file toccati dalla shell, quindi andare grepmanualmente (utile se la shell o il programma non ha un -xflag); i file RC standard non sono sufficienti per un controllo manuale del nome file se qualcosa come oh-my-zsh o configurazioni specifiche del sito stanno estraendo il codice da chissà dove (o anche ci possono essere variabili d'ambiente, come sottolinea Sorontar nella loro risposta) .


Grazie! Anche se l'output è un po 'difficile da analizzare, ma ho trovato il file che ha definito l'alias che stavo cercando. Quando l'alias non è presente in nessun punto dell'elenco, sarebbe sicuro supporre che l'alias sia stato definito manualmente?
polemon

@polemon abbastanza sicuro; potrebbe essere (o essere stato) definito in un file che non viene letto a causa di chissà quale motivo o è stato eliminato (soprattutto se esiste una sorta di framework di shell che aggiunge complessità che l'utente non capire).
thrig

1
Per rendere il punto in cui l'alias è definito un po 'più facile da trovare, puoi usare PS4, che è anteposto a ogni riga di una traccia:PS4='+The ll alias is "${BASH_ALIASES["ll"]}" ' bash -ixlc :
Mark Plotnick,

5

Ecco dove trovo grep -rlmolto utile:

grep -rl alias ~/.bash* ~/.profile /etc/profile /etc/bash.bashrc

ti dirà in quale file aliasviene utilizzata la parola .

Probabilmente dentro ~/.bashrce sicuramente dentro ~/.bash_aliasesse esiste.


È tuttavia impossibile essere assolutamente sicuri che ciò copra tutte le opzioni. Tali file possono anche chiamare o caricare altri file. Una variabile d'ambiente come ENV o $BASH_ENVpuò indirizzare bash a caricare altri file.

cerca la variabile BASH_ENV nell'ambiente, espande il suo valore se appare lì e usa il valore espanso come nome di un file per leggere ed eseguire.

E gli alias possono anche essere definiti impostando una variabile (sottolineatura mia):

BASH_ALIASES
Una variabile di matrice associativa i cui membri corrispondono all'elenco interno di alias come gestito dall'alias incorporato. Gli elementi aggiunti a questo array vengono visualizzati nell'elenco degli alias


grep -rl alias ~/.bash*può corrispondere erroneamente ai file della cronologia, ma +1 per indicare l'array BASH_ALIASES!
Jeff Schaller

2

Non conosco un modo per elencare effettivamente la fonte dei tuoi alias, ma dato che sembra che tu stia usando bash penso che questi siano i possibili file sorgente:

/etc/profile
~/.profile
/etc/bash.bashrc
~/.bash_profile
~/.bashrc

Dovresti essere in grado di accedere a quelli per trovare l'alias, ad es grep 'ls -l --color=auto' /etc/profile ~/.profile /etc/bash.bashrc ~/.bash_profile ~/.bashrc.


O file inclusi da lì ...
Jeff Schaller

@JeffSchaller - Giusto, avresti bisogno di qualcosa di più complesso per quello bash -x, come hai detto. Ho pensato che quanto sopra fosse abbastanza facile da eseguire rapidamente e se non trova l'alias puoi leggere i passaggi dell'esecuzione.
edaemon,

1

Combinando la risposta di thrig con il suggerimento di @ MarkPlotnick , puoi verificare se BASH_ALIASES[ll]è impostato per restringerlo. L' BASH_SOURCEarray e le LINENOvariabili sono particolarmente utili qui. Sfortunatamente, il controllo se BASH_ALIASES[ll]è impostato avrà esito positivo solo dopo aver impostato l'alias e quindi la prima riga di questo tipo potrebbe trovarsi completamente in un altro file.

PS4='${BASH_ALIASES["ll"]+"The ll alias has been defined before"} ${BASH_SOURCE}:$LINENO ' bash -lixc : |&
  grep 'll alias' -m1 -B1

Dare output come:

   /home/muru/.bash_aliases:1 alias 'll=ls -AlhF'
TThe ll alias has been defined before /home/muru/.bashrc:116 alias 'ping=ping -c5'

Puoi persino terminare la shell usando questo controllo:

$ PS4='${BASH_ALIASES["ll"]+"$(kill -9 $$)"} ${BASH_SOURCE}:$LINENO ' bash -lixc : |& tail -n1
   /home/muru/.bash_aliases:1 alias 'll=ls -AlhF'

0

Ho avuto successo semplicemente usando which.

[crclayton@pc scripts]$ which foo
foo:     aliased to python $HOME/projects/python/foo.py

1
whichpuò gestire gli alias in tcsh (e forse prima in csh) e zsh in cui è incorporato, e in bash usando il profilo predefinito sulla famiglia RedHat che ha un kludge per eseguire il programma (esterno) GNU ma alimentarlo con dati alias shell, altrimenti no . Ancora più importante, dice solo a cosa è impostato l'alias, non dove è stato impostato, che era la Q qui.
dave_thompson_085


-1

Ho finalmente trovato la lldefinizione di alias per il nostro web server (CentOS) in due script di shell in /etc/profile.d/:

  • /etc/profile.d/colorls.csh
  • /etc/profile.d/colorls.sh

Ho trovato per primo apprendimento dalle osservazioni di cui sopra in cui il profilo a livello di sistema è stato: /etc/profile. Quel file afferma che gli alias a livello di sistema sono definiti in /etc/bashrc, e in quel file ho visto che scorre attraverso diversi script di shell /etc/profile.d/, quindi ho usato grepin quella directory e finalmente ho trovato le definizioni. Ho anche scoperto che esiste un l.alias che elenca tutti i file dot:

Da colorls.sh:

alias ll='ls -l --color=auto' 2>/dev/null
alias l.='ls -d .* --color=auto' 2>/dev/null
alias ls='ls --color=auto' 2>/dev/null

(Ci sono alias equivalenti in colorls.csh.)


-1

Innanzitutto usa i seguenti comandi

Elenca tutte le funzioni

functions 

Elenca tutti gli alias

alias 

Se non trovi l'alias o la funzione, considera un metodo di ricerca più aggressivo

Versione Bash

bash -ixlc : 2>&1 | grep thingToSearchHere

Versione Zsh

zsh -ixc : 2>&1 | grep thingToSearchHere

Breve spiegazione delle opzioni

-i     Force shell to be interactive.

-c     Take the first argument as a command to execute

-x      -- equivalent to --xtrace

-l      Make bash act as if invoked as a login shell
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.