Come posso vedere quale comando è stato effettivamente eseguito nella shell, attraverso un alias o una funzione


20

Ho una funzione bash (o alias), per esempio function install() {sudo apt-get install $@}. Quando eseguo il comando install dicelab, ciò che mi aspetto sarà effettivamente eseguito è sudo apt-get install dicelab. Dove posso vedere cosa è stato effettivamente gestito dalla shell? Vorrei assicurarmi che i miei alias più complicati funzionino come previsto.


Fa $@parte del tuo alias? Ricorda che gli alias in realtà non supportano argomenti, che si espanderanno ai parametri posizionali (se presenti) del contesto che chiama l'alias. Il solito modo di funzionare somealias some argsfunziona semplicemente espandendo l'alias e lasciando gli argomenti per seguirlo. Se vuoi davvero essere in grado di accedere agli argomenti, usa una funzione e cita il"$@"
ilkkachu


1
@AlonAviv, Bene. :) Comunque, è meglio prendere l'abitudine di citare ciò "$@", altrimenti gli argomenti con spazi bianchi o glob bruceranno.
ilkkachu,

1
@DarkHeart Questo non è un duplicato. L'altra domanda non riguarda le funzioni della shell.
Kusalananda

2
Né questo è stato fino a quando non è stato modificato per cambiare completamente argomento (e invalidare una delle risposte esistenti).
Michael Homer,

Risposte:


29

Utilizzare set -xnella shell.

$ alias hello='echo hello world!'
$ hello
hello world!

$ set -x
$ hello
+ echo hello world!
hello world!

Utilizzando set -xgiri sulla xtraceopzione di shell ( set +xlo spegne) e dovrebbe funzionare in tutta la Bourne-come gusci, come bash, dash ksh93, pdkshe zsh. Questo richiede alla shell di visualizzare il comando che viene eseguito dopo che sono state eseguite espansioni alias, espansioni variabili ecc.

L'output sarà sul flusso di errori standard della shell (proprio come il prompt ordinario), quindi non interferirà con i reindirizzamenti dell'output standard e sarà preceduto da un prompt come definito dalla PS4variabile shell ( +␣per impostazione predefinita).

Esempio con alcune funzioni:

$ world () { echo "world"; }
$ hello () { echo "hello"; }
$ helloworld () { printf '%s %s!\n' "$(hello)" "$(world)"; }

$ helloworld
hello world!

$ set -x
$ helloworld
+ helloworld
++ hello
++ echo hello
++ world
++ echo world
+ printf '%s %s!\n' hello world
hello world!

Sto correndo con set -xtutte le mie shell interattive per impostazione predefinita. È bello vedere cosa è stato effettivamente eseguito ... ma ho notato che il completamento programmabile delle schede, ecc. Potrebbe causare l'output di traccia indesiderato in alcune shell.


14

È possibile utilizzare shell-expand-line, che è associato a Control- Alt- eper impostazione predefinita:

$ bind -p | grep shell-expand-line
"\e\C-e": shell-expand-line

Tra le altre cose, sostituirà gli alias nella riga corrente con la loro definizione in modo da poter vedere un comando che si sta ancora andando a correre. Esempio:

$ install dicelab # now press C-Alt-e
$ sudo apt-get install  dicelab # the above line will be replaced with this

questa è una bella caratteristica. sai se zsh ha un comando equivalente a shell-expand-line?
the_velour_fog

Scusa, non perché non uso zsh. Ma alcune persone hanno escogitato le proprie idee: wiki.math.cmu.edu/iki/wiki/tips/20140625-zsh-expand-alias.html
Arkadiusz Drabczyk


1

Puoi usare il built- typein bash per vedere un alias o una definizione di funzione che eseguirai:

$ type ls
ls is aliased to `ls --color=auto -p'

$ type -a ls
ls is aliased to `ls --color=auto -p'
ls is /bin/ls

$ install() { sudo apt-get install "@"; }

$ type install
install is a function
install () 
{ 
    aptitude install "@"
}
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.