Göre Bash kılavuzda , ortam değişkeni BASH_COMMANDiç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_COMMANDbu 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_COMMANDve değişken BASH_COMMANDdizgiyi içeriyor echo $BASH_COMMAND. Neden bu sefer işe yaradı, ama daha önce olmadı?
setYine bir şey yapalım :
$ set | grep BASH_COMMAND=
BASH_COMMAND='echo $BASH_COMMAND'
$
Öyleyse bekle. O edildi O çalıştırıldığında set echokomutu ve değildi sonradan tanımsız. Ben çalıştırıldığında Ama setyine BASH_COMMAND değildi ayarlı setkomuta. setBuradaki 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 echodeğil setmi? 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_COMMANDBir dosyada grep yapmaya çalışacağız ve o $BASH_COMMANDzaman bir grepkomut içermeli , grepo grepkomut 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 tmpgenişletildi grep grep $BASH_COMMAND tmp tmp(değişken, elbette sadece bir kez genişledi) ve böylece grep, bir kez $BASH_COMMANDvar olmayan bir dosyada ve iki kez de dosyada elimde tmp.
S1: Mevcut varsayımım doğru mu:
BASH_COMMANDsadece 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_COMMANDYü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_COMMANDyürütüyorum bu komuta ayarlar. MYVARIABLE=$BASH_COMMANDBenim başlangıcımda doğru yaptığımda bile $PROMPT_COMMAND, o zaman MYVARIABLEdizeyi içerir MYVARIABLE=$BASH_COMMAND, çünkü bir atama da bir komuttur. (Bu soru şu anki komutu bir $PROMPT_COMMANDyü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.