Göre Bash kılavuzda , ortam değişkeni BASH_COMMAND
içeren
Şu anda yürütülmekte olan ya da yürütülmek üzere olan komut, kabuk bir tuzağın sonucu olarak bir komut çalıştırmadığı sürece, bu durumda tuzak anında çalışan komuttur.
Bu tuzak köşesi örneğini bir kenara çekmek, eğer doğru anlarsam, bir komutu yürüttüğümde, değişkenin BASH_COMMAND
bu komutu içerdiği anlamına gelir . Kesinlikle bu değişken komut yürütme sonrasında ayarlanmazsa olmadığını açık değil (yani sadece avaialble iken kimse olduğu için "komutu iddia edebilir rağmen komut ancak sonra çalıştığı) şu anda infaz veya varlık edilmek üzere yürütülen" , sadece yürütülen komut değildir .
Ama kontrol edelim:
$ set | grep BASH_COMMAND=
$
Boş. Görmeyi beklerdim BASH_COMMAND='set | grep BASH_COMMAND='
ya da belki sadece BASH_COMMAND='set'
, ama boş beni şaşırttı.
Başka bir şey deneyelim:
$ echo $BASH_COMMAND
echo $BASH_COMMAND
$
Bu mantıklı. Komutu çalıştırdım echo $BASH_COMMAND
ve değişken BASH_COMMAND
dizgiyi içeriyor echo $BASH_COMMAND
. Neden bu sefer işe yaradı, ama daha önce olmadı?
set
Yine bir şey yapalım :
$ set | grep BASH_COMMAND=
BASH_COMMAND='echo $BASH_COMMAND'
$
Öyleyse bekle. O edildi O çalıştırıldığında set echo
komutu ve değildi sonradan tanımsız. Ben çalıştırıldığında Ama set
yine BASH_COMMAND
değildi ayarlı set
komuta. set
Buradaki komutu ne sıklıkta çalıştırsam da , sonuç aynı kalıyor. Öyleyse, değişken yürütülürken ayarlanır mı, çalıştırılırken echo
değil set
mi? Bakalım.
$ echo Hello AskUbuntu
Hello AskUbuntu
$ set | grep BASH_COMMAND=
BASH_COMMAND='echo $BASH_COMMAND'
$
Ne? Değişken yüzden çalıştırıldığında kuruldu echo $BASH_COMMAND
, ama değil ben yürütüldüğünde echo Hello AskUbuntu
? Şimdi fark nerede? Değişken yalnızca geçerli komutun kendisi aslında kabuğu değişkeni değerlendirmek için zorladığında mı ayarlanır? Farklı bir şey deneyelim. Belki bu sefer bazı dış komutlar, bir bash yerleşik değil, bir değişiklik için.
$ /bin/echo $BASH_COMMAND
/bin/echo $BASH_COMMAND
$ set | grep BASH_COMMAND=
BASH_COMMAND='/bin/echo $BASH_COMMAND'
$
Hmm, tamam ... tekrar, değişken ayarlandı. Peki şimdiki tahminim doğru mu? Değişken, yalnızca değerlendirilmesi gerektiğinde ayarlandı mı? Niye ya? Niye ya? Performans nedeniyle mi? Bir tane daha deneyelim. $BASH_COMMAND
Bir dosyada grep yapmaya çalışacağız ve o $BASH_COMMAND
zaman bir grep
komut içermeli , grep
o grep
komut için grep yapmalı (yani kendisi için). öyleyse uygun bir dosya yapalım:
$ echo -e "1 foo\n2 grep\n3 bar\n4 grep \$BASH_COMMAND tmp" > tmp
$ grep $BASH_COMMAND tmp
grep: $BASH_COMMAND: No such file or directory
tmp:2 grep <-- here, the word "grep" is RED
tmp:4 grep $BASH_COMMAND tmp <-- here, the word "grep" is RED
tmp:2 grep <-- here, the word "grep" is RED
tmp:4 grep $BASH_COMMAND tmp <-- here, the word "grep" is RED
$ set | grep BASH_COMMAND=
BASH_COMMAND='grep --color=auto $BASH_COMMAND tmp'
$
Tamam, ilginç. Komut grep $BASH_COMMAND tmp
genişletildi grep grep $BASH_COMMAND tmp tmp
(değişken, elbette sadece bir kez genişledi) ve böylece grep
, bir kez $BASH_COMMAND
var olmayan bir dosyada ve iki kez de dosyada elimde tmp
.
S1: Mevcut varsayımım doğru mu:
BASH_COMMAND
sadece bir komut gerçekten değerlendirmeye çalıştığında ayarlanır; ve- o olduğu değil açıklamayla inanmak bize yol olsa bile, bir komutun yürütülmesi sonra unset?
S2: Evet ise neden? Performans? Hayır ise, yukarıdaki komut sırasındaki davranış başka nasıl açıklanabilir?
S3: Son olarak, bu değişkenin gerçekten anlamlı bir şekilde kullanılabileceği bir senaryo var mı? $PROMPT_COMMAND
Yürütülmekte olan komutu analiz etmek için aslında onu kullanmaya çalışıyordum (ve buna bağlı olarak bazı şeyler yapıyordum), ancak yapamıyorum, çünkü en kısa sürede $PROMPT_COMMAND
, içimde değişkene bakmak için bir komut $BASH_COMMAND
yürütüyorum bu komuta ayarlar. MYVARIABLE=$BASH_COMMAND
Benim başlangıcımda doğru yaptığımda bile $PROMPT_COMMAND
, o zaman MYVARIABLE
dizeyi içerir MYVARIABLE=$BASH_COMMAND
, çünkü bir atama da bir komuttur. (Bu soru şu anki komutu bir $PROMPT_COMMAND
yürütme içinde nasıl elde edebileceğimle ilgili değil . Bildiğim başka yollar da var.)
Heisenberg'in belirsizlik ilkesine benziyor. Sadece değişkeni gözlemleyerek değiştiririm.
bash
über-gurular var.