Ist es möglich zu testen, ob ein Bash-Skript mit ausgeführt wurde -x
?
Ich schreibe ein Skript, in dem auch einige Remote-Skripte ausgeführt werden, und ich möchte in der Lage sein, Folgendes zu tun:
USE_X="$( run_with_x && "-x" || "" )"
ssh $host "bash $USE_X some_script.sh"
*x*
erweitert sich?case $- in *x*) USE_X="-x";; *) USE_X=;; esac
@ bbaja42 Es wird nicht erweitert: Es ist ein Muster, mit dem die Zeichenfolge$-
abgeglichen wird.*) USE_X=;;
ändert nichts, wennUSE_X
es nicht zuvor festgelegt wurde. Auch das ganzecase
Konstrukt ist unnötig ( siehe meine Version - ist das nicht einfacher?)USE_X
zuvor initialisiert wurde. Ich halte Ihre Version nicht für einfacher: Sie ist einige Zeichen kürzer (und selbst dann nur, wennUSE_X
sie initialisiert wurde, andernfalls ist sie länger), aber auf Kosten der Klarheit und Portabilität.USE_X
ist für die beabsichtigte Verwendung von OP nicht erforderlich (um$USE_X
an weitere Skripte weitergegeben zu werden). Die Verwendung einescase
Konstrukts sieht meiner Ansicht nach weniger klar und natürlich aus als eine reguläre Zustandsbewertung.Wahrscheinlich die einfachste Art des Parsens
$-
, ähnlich der Methode von dagbrown (ebenfalls reinbash
), jedoch ohne Verwendungcase
und Backticks (Subshell):oder noch kürzer:
Beachten Sie, dass
[[
ist nicht ein Aufruf vontest
eingebautem Programm (wie es der Fall mit[
), aber ein bash Syntax - Konstrukt (nachman bash
und dieser Entwickler Empfehlung ). Also behaupte ich, es sei "purer bash";)quelle
Dieser Ausdruck ist wahr, wenn das Skript ausgeführt wird
-x
, andernfalls falsch:[[ $- =~ x ]]
Dieser Ausdruck ist also "-x", wenn das Skript ausgeführt wird,-x
und "" (leer), andernfalls:$([[ $- =~ x ]] && echo "-x")
quelle
${-//[^x]}
Wenn Sie dies einer Variablen zuweisen, wie z. B.:x=${-//[^x]}
Der folgende Ausdruck ist leer, wenn kein x und -x vorhanden sind. Andernfalls:${x:+-x}
Kombinieren Sie wie :x=${-//[^x]} USE_X=${x:+-x}
Oder wenn Sie keine zusätzliche Variable verwenden möchten, können Sie USE_X wiederverwenden:USE_X=${-//[^x]} USE_X=${USE_X:+-x}
Dies ist viel schneller als ein Vergleich mit regulären Ausdrücken! (Aber weniger lesbar, wenn man nur den Code betrachtet und herausfindet, was er tut ...)Nachdem Sie Manpages gelesen und nach Dingen gesucht haben, finden Sie hier die Lösung:
Ergebnis:
quelle
Die Bash-Manpage dokumentiert
set -o xtrace
als äquivalent zuset -x
, was wiederum gleichbedeutend ist mit der Angabe-x
als Argument für die Shell. (Bisher ist dies mit SUSv3 sh kompatibel, mit der Einschränkung, dass-o option
"wenn das System die Option User Portability Utilities unterstützt" erforderlich ist.)Auch
set -o
ohne eine Option druckt den aktuellen Status aller von den-o
Optionen. (SUSv3 gibt dies ebenfalls an, jedoch nicht sinnvoll. Das Format ist nicht angegeben. Sie können sich also nur darauf verlassen, wenn Sie wissen, dass Sie eine Shell ausführen, die ein ähnliches Format wie Bash verwendet.)Die Pipeline
set -o | grep xtrace | grep -q on
sollte also genau das sein, wonach Sie suchen.quelle