Bagaimana saya bisa melihat perintah apa yang sebenarnya dijalankan di shell, melalui alias atau fungsi

20

Saya memiliki fungsi bash (atau alias), misalnya function install() {sudo apt-get install $@}. Saat menjalankan perintah install dicelab, apa yang saya harapkan sebenarnya akan dijalankan adalah sudo apt-get install dicelab. Di mana saya bisa melihat apa yang sebenarnya dijalankan oleh shell? Saya ingin memastikan bahwa alias saya yang lebih rumit berfungsi seperti yang diharapkan.

Alon Aviv
sumber
Apakah itu $@bagian dari alias Anda? Ingat bahwa alias tidak benar-benar mendukung argumen, yang akan diperluas ke parameter posisi (jika ada) dari konteks yang memanggil alias. Cara biasa menjalankan somealias some argsberfungsi hanya dengan memperluas alias dan meninggalkan argumen untuk mengikutinya. Jika Anda benar-benar ingin dapat mengakses argumen, gunakan fungsi, dan kutip"$@"
ilkkachu
2
Kemungkinan duplikat alias Selaraskan bersarang untuk perintah sumbernya
DarkHeart
1
@AlonAviv, Bagus. :) Namun, biasakan mengutip "$@", argumen dengan spasi putih atau karakter glob akan membakar sebaliknya.
ilkkachu
1
@DarkHeart Ini bukan duplikat. Pertanyaan lain tidak terkait dengan fungsi shell.
Kusalananda
2
Yang ini juga tidak sampai diedit untuk sepenuhnya mengubah subjeknya (dan membatalkan salah satu jawaban yang ada).
Michael Homer

Jawaban:

29

Gunakan set -xdi shell.

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

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

Menggunakan set -xbergantian pada xtraceopsi shell ( set +xmematikannya) dan harus bekerja di semua Bourne-seperti kerang, seperti bash, dash ksh93, pdkshdan zsh. Ini meminta shell untuk menampilkan perintah yang dieksekusi setelah ekspansi alias dan ekspansi variabel dll. Telah dilakukan.

Outputnya akan berada pada stream kesalahan standar shell (seperti prompt biasa) sehingga tidak akan mengganggu pengalihan output standar, dan itu akan didahului oleh prompt seperti yang didefinisikan oleh PS4variabel shell ( +␣secara default).

Contoh dengan beberapa fungsi:

$ 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!

Saya menjalankan dengan set -xsemua kerang interaktif saya secara default. Sangat menyenangkan untuk melihat apa yang sebenarnya dieksekusi ... tapi saya perhatikan bahwa penyelesaian tab yang dapat diprogram, dll. Dapat menyebabkan keluaran jejak yang tidak diinginkan di beberapa shell.

Kusalananda
sumber
14

Anda dapat menggunakan shell-expand-line, yang terikat ke Control- Alt- esecara default:

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

Antara lain, itu akan mengganti alias di baris saat ini dengan definisi mereka sehingga Anda dapat melihat perintah yang masih akan Anda jalankan. Contoh:

$ install dicelab # now press C-Alt-e
$ sudo apt-get install  dicelab # the above line will be replaced with this
Arkadiusz Drabczyk
sumber
ini fitur yang bagus. Anda tahu apakah zsh memiliki perintah yang setara shell-expand-line?
the_velour_fog
Maaf, saya tidak melakukannya karena saya tidak menggunakan zsh. Tetapi beberapa orang memiliki ide sendiri: wiki.math.cmu.edu/iki/wiki/tips/20140625-zsh-expand-alias.html
Arkadiusz Drabczyk
@the_velour_fog, lihat Menyelesaikan semua alias dalam baris perintah zsh
Stéphane Chazelas
1

Anda bisa menggunakan bash builtin typeuntuk melihat alias atau definisi fungsi yang akan Anda jalankan:

$ 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 "@"
}
belkka
sumber