Set -x ne yapar?


261

Şu satırda bir kabuk komut dosyası var:

[ "$DEBUG" == 'true' ] && set -x

15
Bir göz atın:help -m set | less
Cyrus

4
Bahşiş için teşekkürler help -m set. Bu işe yarıyor. Sormadan man setönce denedim , ancak ubuntu varNo manual entry for set
Ole

2
@Ole, setbash içine yerleştirilmiştir, bu yüzden man bashSHELL BUILTIN COMMANDS bölümünde bulabilirsiniz. Adam sayfasını görüntülerken muhtemelen bu regexp arayarak kendisine atlayabilir: \bset \[.
Kullanıcı5910

Yanıtlar:


365

set -xçalıştırılan tüm komutların terminale yazdırıldığı kabuk modunu etkinleştirir. Sizin durumunuzda, hata ayıklama için açıkça kullanılır; bu, tipik bir kullanım örneğidir set -x: yürütüldüğü gibi her komutu yazdırmak, beklendiği gibi çalışmazsa komut dosyasının denetim akışını görselleştirmenize yardımcı olabilir.

set +x devre dışı bırakır.


5
Bu özellik nasıl devre dışı bırakılır?
feedc0de

85
@DanielBrunner: set +xdevre dışı bırakır.
John Zwinck

2
Bu ÇOK faydalı! Keşke birisi bana daha önce söylemiş olsaydı. Komut dosyası yazma konusunda meta becerimizi artırabilecek başka ilginç numaralar var mı?
Öğrenci

7
@Öğrenci: set -ekomut dosyanızın en üstünde, bir hata oluştuğunda (ve açıkça işlenmediğinde) komut dosyasının bir hata ile çıkmasını sağlar. Bunu varsayılan olarak çok tercih edilen buluyorum, ki bu da willy-nilly'ye devam etmek (Visual Basic'in rezil gibi On Error Resume Next).
John Zwinck

1
@JohnZwinck, maalesef, kod incelemesini neredeyse imkansız kılan noktaya kadar çok istenmeyen yan etkilere set -esahiptir (çünkü belirli bir hattın davranışı çağrı yığınında nelerin olduğuna bağlıdır - eğer bir fonksiyon "kontrol" bağlamında çağrılırsa , devre dışı bırakılır o çağırma ve sırayla her şey için). BashFAQ # 105'teki alıştırmalara bakın . set -e
Charles Duffy

78

set -x

Genişletildikten ve yürütülmeden önce komutlar, büyük / küçük harf komutları, seçme komutları ve komutlar ve bunların bağımsız değişkenleri veya ilişkili sözcük listeleri için aritmetik için basit komutların bir izini yazdırır. PS4 değişkeninin değeri genişletilir ve sonuç değeri komuttan ve genişletilmiş bağımsız değişkenlerinden önce yazdırılır.

[ kaynak ]

Misal

set -x
echo `expr 10 + 20 `
+ expr 10 + 20
+ echo 30
30

set +x
echo `expr 10 + 20 `
30

Yukarıdaki örnek kullanımını göstermektedir set -x. Kullanıldığında, yukarıdaki aritmetik ifade genişletildi. Tek bir hattın adım adım nasıl değerlendirildiğini görebiliyorduk.

  • İlk adım exprdeğerlendirildi.
  • İkinci adım echodeğerlendirildi.

Set hakkında daha fazla bilgi için → bu bağlantıyı ziyaret edin

kabuk betiğiniz söz konusu olduğunda,

[ "$DEBUG" == 'true' ] && set -x

Yürütme modu olarak seçildiğinde, komut dosyanız bazı ek bilgi satırları yazdırıyor olabilir DEBUG. Geleneksel olarak insanlar,-d



6

-u: varsayılan olarak devre dışıdır. Etkinleştirildiğinde, yapılandırılmamış bir değişken kullanılırken bir hata mesajı görüntülenir.

-v: varsayılan olarak etkin değil. Etkinleştirmeden sonra, bilgilerin çıktısı alınmadan önce bilgilerin orijinal içeriği (değişken çözünürlük olmadan) görüntülenir.

-x: varsayılan olarak etkin değil. Etkinleştirilirse, komut çalıştırılmadan önce komut içeriği görüntülenir (değişken çözünürlükten sonra bir ++ sembolü vardır).

Aşağıdaki farkları karşılaştırın:

/ # set -v && echo $HOME
/root
/ # set +v && echo $HOME
set +v && echo $HOME
/root

/ # set -x && echo $HOME
+ echo /root
/root
/ # set +x && echo $HOME
+ set +x
/root

/ # set -u && echo $NOSET
/bin/sh: NOSET: parameter not set
/ # set +u && echo $NOSET
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.