Şu anda yürütülen bash betiğinin hata ayıklama için -x ile çağrılıp çağrılmadığını nasıl anlayabilirim?


11

launch.shDoğru sahibi ile dosya oluşturmak için kendini başka bir kullanıcı olarak yürüten bir komut dosyası var. Eğer asıl betiğe geçirilmişse bu çağrıyı -x iletmek istiyorum

if [ `whoami` == "deployuser" ]; then
  ... bunch of commands that need files to be created as deployuser
else
  echo "Respawning myself as the deployment user... #Inception"
  echo "Called with: <$BASH_ARGV>, <$BASH_EXECUTION_STRING>, <$->"
  sudo -u deployuser -H bash $0 "$@"  # How to pass -x here if it was passed to the script initially?
fi

Bash hata ayıklama sayfasını okudum ama orijinal komut dosyasının başlatılıp başlatılmadığını söyleyen net bir seçenek yok gibi görünüyor -x.

Yanıtlar:


15

bashKomut satırında iletilebilen setbayrakların çoğu bayraktır. setbu bayrakları çalışma zamanında değiştirebilen yerleşik bir kabuktur. Örneğin, bir komut dosyasını çağırmak bash -x foo.shtemelde komut dosyasının set -xen üstündeki ile aynıdır .

Bunun setsorumlu olan kabuk olduğunu bilmek, nereye bakacağımızı bilmemizi sağlar. Şimdi yapabiliriz help setve aşağıdakileri elde ederiz:

$ help set
set: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]
...
      -x  Print commands and their arguments as they are executed.
...
    Using + rather than - causes these flags to be turned off.  The
    flags can also be used upon invocation of the shell.  The current
    set of flags may be found in $-.  The remaining n ARGs are positional
    parameters and are assigned, in order, to $1, $2, .. $n.  If no
    ARGs are given, all shell variables are printed.
...

Bundan da anlaşılıyor ki $-, bize hangi bayrakların etkin olduğunu söylemeliyiz.

$ bash -c 'echo $-'
hBc

$ bash -x -c 'echo $-'
+ echo hxBc
hxBc

Yani temelde yapmanız gerekenler:

if [[ "$-" = *"x"* ]]; then
  echo '`-x` is set'
else
  echo '`-x` is not set'
fi

Bonus olarak, tüm bayrakları kopyalamak isterseniz,

bash -$- /other/script.sh

1
[[ $- == *x* ]]Kalıp eşleşmesi için kullanmanız gerekir .
glenn jackman

1
Ya da standardı kullanabilirsiniz case $- in *x*) ... ;; *) ... ;; esac. caseTaşınabilir olması gereken betiklerin bu kullanımını bilmek yararlıdır ve şimdi bildiğime göre, bunu hatırlamaktan daha kolay olduğunu düşünüyorum, "bas-spesifik, o zaman [[, başka case" hatırlamaktan daha kolay .
Hvd

Tamam, o zaman bu yorum dizisi silinebilir.
l0b0

$-çıktılar hB. Ne yapmak -hve -Bbayraklar / argümanlar mı? O zaman bash man sayfasında görmüyorum .
Dan Dascalescu

3

set -oirade çıkışı xtrace oneğer -xaksi takdirde kullanılır xtrace off.


2

@Patrick'in cevabı "doğru" olmakla birlikte, altyazıya ne yapacağını söyleyen bir parametre veya dışa aktarılan değişken de aktarabilirsiniz - izlemeyi açma gibi.

Bunun dezavantajı vardır (sanırım) girmek üzere olduğunuz her bir script seviyesine tekrar aktarmanız gerekir.

Sadece çıkış / değiştirilmiş davranışı ihtiyacınız olan komut (lar) ı seçici olarak izleyebilme (veya başka bir şekilde etkileyebilme) avantajına sahiptir - yabancı çıktıyı kesmek vb. İçin. hala çağrılan komut dosyasında açılır. Bu bir ya hep ya hiç önerisi değil.

Sorunuzun bir parçası değil, ilgili:

Bazen bir değişken tanımlarım

E=""
E="echo "

veya

E=""
E=": "

ve (birden çok ifadede)

"${E}" rsync ...

veya sadece ikinci varyasyon için,

"${E}" echo "this is a debugging message"

Sonra, komutların çalışmasını istediğimde ikinci tanımı açıklıyorum. Bu tekniği bunun yerine bir parametre veya dışa aktarılan değişkenle de kullanabilirsiniz.

Bunlardan herhangi biriyle, yöntemin yalnızca bileşik listesindeki ilk ifade üzerinde çalışacağı garanti edildiğinden, bileşik ifadelere dikkat etmeniz gerekir.


1

Sürecin PID'sini alabilir ve argümanların ne olduğunu görmek için ps ile süreç tablosunu inceleyebilirsiniz.


'PID işlemini şu yolla alabilirsiniz: $$
Paul Calabro

2
Bunun genel olarak iyi bir fikir olduğunu düşünmüyorum, çünkü eğer -xscript içinde ayarlanmışsa, psçıktıda gösterilmez . Ve bu çözüm zaten verimsiz.
vinc17

Bu adil bir argüman. Aslında $ değişkenini bilmiyordum. Bunu çözmek için çok daha iyi bir yaklaşım gibi görünüyor.
Paul Calabro

1
Önerdiğim bir set -oçözüm de var . Ayrıca, ilişkili bir bayrağı olmayan seçenekler için de çalışmalıdır -x.
vinc17
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.