Bir takma ad veya işlev aracılığıyla kabukta gerçekte hangi komutun çalıştırıldığını nasıl görebilirim


20

Örneğin bir bash işlevi (veya diğer adı) var function install() {sudo apt-get install $@}. Komutu install dicelabçalıştırırken, aslında çalışmasını beklediğim şey sudo apt-get install dicelab. Kabuk tarafından neyin yürütüldüğünü nereden görebilirim? Daha karmaşık takma adlarımın beklendiği gibi çalıştığından emin olmak istiyorum.


Bu $@takma adın bir parçası mı ? Takma adların, takma adı çağıran bağlamın konum parametrelerine (varsa) genişleyecek bağımsız değişkenleri gerçekten desteklemediğini unutmayın. Olağan çalışma şekli somealias some args, takma adı genişleterek ve argümanları takip etmek için bırakarak çalışır. Eğer gerçekten argümanlara erişmek istiyorsanız, bir fonksiyon kullanın ve"$@"
ilkkachu


1
@AlonAviv, Güzel. :) Yine de, en iyi şekilde alıntı yapma alışkanlığı olsun "$@", boşluk veya glob karakterli argümanlar aksi takdirde yanacaktır.
ilkkachu

1
@DarkHeart Bu kopya yok. Diğer soru kabuk fonksiyonları ile ilgili değildir.
Kusalananda

2
Konusunu tamamen değiştirmek (ve mevcut cevaplardan birini geçersiz kılmak) düzenlenene kadar bu da değildi.
Michael Homer

Yanıtlar:


29

set -xKabukta kullanın .

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

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

Kullanımı set -xile ilgili dönüşleri xtracekabuk seçeneği ( set +xkapanır) ve çalışmalıdır tüm Bourne benzeri kabukları gibi bash, dash ksh93, pdkshve zsh. Bu, kabuktan takma genişletmeler ve değişken genişletmeler vb. Gerçekleştirildikten sonra yürütülen komutu görüntülemesini ister.

Çıktı, kabuğun standart hata akışında olacaktır (tıpkı sıradan istem gibi), bu nedenle standart çıkışın yeniden yönlendirmelerine müdahale etmez ve öncesinde PS4kabuk değişkeni tarafından tanımlanan bir istem ( +␣varsayılan olarak) olur.

Birkaç işlev içeren örnek:

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

set -xVarsayılan olarak tüm etkileşimli kabuklarımda koşuyorum . Gerçekte ne yürütüldüğünü görmek güzel ... ama programlanabilir sekme tamamlama vb. Bazı kabuklarda istenmeyen iz çıktısına neden olabilir.


14

Varsayılan shell-expand-lineolarak Control- Alt- işaretine bağlı olarak kullanabilirsiniz e:

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

Eğer hala konum bir komut görebilirsiniz böylece diğer şeylerin yanı sıra, onların tanımıyla şimdiki doğrultusunda adlar yerini alacak olacak çalıştırın. Misal:

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

bu güzel bir özellik. zsh komutuna eşdeğer bir komutu olup olmadığını biliyor musunuz shell-expand-line?
the_velour_fog

Üzgünüm, kullanmıyorum çünkü kullanmıyorum zsh. Ancak bazı insanlar kendi fikirlerini ortaya çıkardılar
Arkadiusz Drabczyk


1

typeÇalıştırdığınız bir diğer adı veya işlev tanımını görmek için bash yerleşimini kullanabilirsiniz :

$ 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 "@"
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.