Komut dosyalarında hata ayıklama, -x ile set -euxo pipefail arasındaki fark nedir?


17

Senaryoları hata ayıklamak için bildiğim ana yolu -xshabang ( #!/bin/bash -x) eklemek .

Geçenlerde set -euxo pipefailolduğu gibi, shabang altına ekleyerek yeni bir yolla karşılaştım:

#!/bin/bash
set -euxo pipefail

Hata ayıklamanın iki yolu arasındaki temel fark nedir? Birini diğerinin üzerinde tercih edeceğiniz zamanlar var mı?

Birinci sınıf öğrencisi olarak, burada okuduktan sonra böyle bir sonuca varamadım.

Yanıtlar:


15

İlk olarak, http://explainshell.com-o tarafından sunulan seçeneğin açıklamasının tamamen doğru olmadığından korkuyorum .

Olduğu göz önüne alındığında set, bir Bulit komutuyla, biz onun belgelerine görebilirsiniz olduğunu helpyürüterek help set:

  -o option-name
      Set the variable corresponding to option-name:
          allexport    same as -a
          braceexpand  same as -B
          emacs        use an emacs-style line editing interface
          errexit      same as -e
          errtrace     same as -E
          functrace    same as -T
          hashall      same as -h
          histexpand   same as -H
          history      enable command history
          ignoreeof    the shell will not exit upon reading EOF
          interactive-comments
                       allow comments to appear in interactive commands
          keyword      same as -k
          monitor      same as -m
          noclobber    same as -C
          noexec       same as -n
          noglob       same as -f
          nolog        currently accepted but ignored
          notify       same as -b
          nounset      same as -u
          onecmd       same as -t
          physical     same as -P
          pipefail     the return value of a pipeline is the status of
                       the last command to exit with a non-zero status,
                       or zero if no command exited with a non-zero status
          posix        change the behavior of bash where the default
                       operation differs from the Posix standard to
                       match the standard
          privileged   same as -p
          verbose      same as -v
          vi           use a vi-style line editing interface
          xtrace       same as -x

Gördüğünüz gibi -o pipefail:

bir boru hattının dönüş değeri, sıfır olmayan bir durumla son çıkan komutun durumudur veya sıfır olmayan bir durumdan çıkılmamışsa sıfırdır.

Ancak şunu söylemez: Write the current settings of the options to standard output in an unspecified format.

Şimdi, -xzaten bildiğiniz gibi hata ayıklama için kullanılır ve -ekoddaki ilk hatadan sonra yürütmeyi durdurur. Bunun gibi bir senaryo düşünün:

#!/usr/bin/env bash

set -euxo pipefail
echo hi
non-existent-command
echo bye

echo byeZaman hat yürütülecek asla -eçünkü kullanılan non-existent-command0 dönmez:

+ echo hi
hi
+ non-existent-command
./setx.sh: line 5: non-existent-command: command not found

Olmadan -eson satırı baskılı görünecek olsa da, bir hata biz söylemedi oldu çünkü Bashotomatik çıkmak için:

+ echo hi
hi
+ non-existent-command
./setx.sh: line 5: non-existent-command: command not found
+ echo bye
bye

set -e ilk hatayla karşılaşıldığında komut dosyasının durdurulacağından emin olmak için genellikle komut dosyasının en üstüne yerleştirilir - örneğin, bir dosya indirilemediğinde dosyayı ayıklamak mantıklı değildir.


Cevabı okudum ama bunu aldığımdan emin değilim: Kullanmanızı tavsiye ettiğiniz sözdizimi nedir (Bunun biraz farklı olduğuna inanıyorum set -uxo pipefail).
JohnDoea

Eğer set -esadece neden olacak komut dosyası hatayla sonlanmasına neden olacaktır. Örneğinizde, bununla birlikte birçok seçenekten yalnızca biridir -uxo pipefail.
Arkadiusz Drabczyk

Bu eargümanı kullanmamı önerip önermediğinizden emin olmadığımı söylemek istedim .
JohnDoea

1
Gereksinimlerinize bağlıdır. Varsayılan olarak ayarlanmamıştır, bu nedenle yazara bağlıdır. Komut dosyasında kullanılan tüm komutların her zaman 0başarıya döneceğinden ve başarısızlık durumunda sıfırdan farklı olacağından eminseniz -efaydalıdır, ancak diğer her şey dikkatle kullanılmalıdır.
Arkadiusz Drabczyk

1
Bu bağlamda neden -u önerildiğini açıklayarak cevabı genişletebilir misiniz?
Patrice
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.