Bash: протестируйте, был ли исходный скрипт запущен с '-x'

Я встретился с этой проблемой во встроенной системе Linux, которая должна была обработать даты в прошлом 2038 в некоторых долгосрочных криптографических сертификатах, таким образом, я скажу, что likehood этого зависит от Вашего домена приложения.

В то время как большинство систем должно быть готово задолго до 2038 при нахождении сегодня дат далеко в будущее у Вас может быть проблема.

7
03.10.2011, 05:56
5 ответов

Только посмотрите $- переменная.

USE_X=`case "$-" in *x*) echo "-x" ;; esac`

(Да, мне действительно удавалось сделать это, не вызывая grep. Сохраните pids!)

9
27.01.2020, 20:13
  • 1
    , что делает *x* расшириться до? –  bbaja42 03.10.2011, 09:55
  • 2
    Какая трата pid! case $- in *x*) USE_X="-x";; *) USE_X=;; esac @bbaja42 Это ни до чего не расширяется: это - шаблон что строка $- подобран против. спасибо –  Gilles 'SO- stop being evil' 04.10.2011, 00:08
  • 3
    @Gilles Ваш пример также содержит ненужную часть: *) USE_X=;; изменения ничто, если USE_X не был установлен ранее. Кроме того, целое case конструкция является ненужной (см. мою версию - разве, который не более прост?) –  rozcietrzewiacz 04.10.2011, 19:12
  • 4
    @rozcietrzewiacz Эта часть является ненужным если USE_X был инициализирован раньше. Я не считаю Вашу версию более простой: это - несколько символов короче (и даже затем, только если USE_X был инициализирован, иначе это длиннее), но за счет ясности и мобильность. мобильность –  Gilles 'SO- stop being evil' 04.10.2011, 20:11
  • 5
    @Gilles не является предметом этого вопроса, это об ударе. Инициализация USE_X не необходимо в целях надлежащего использования OP (для передачи $USE_X к дальнейшим сценариям). Используя case создайте взгляды, менее ясные и естественные, чем регулярная оценка условия, по моему мнению. –  rozcietrzewiacz 04.10.2011, 20:53

Вероятно, самый простой способ проанализировать $-, подобный методу dagbrown (также чистый bash), но без использования case и обратные галочки (подоболочка):

if  [[ ${-/x} != $- ]] ; then USE_X="-x"; fi

или еще короче:

[[ ${-/x} != $- ]] && USE_X="-x"

Отметьте это [[ не вызов test встроенная программа (как имеет место с [), но конструкция синтаксиса удара (согласно man bash и эта dev рекомендация). Таким образом, я утверждаю этого быть "более чистым ударом" ;)

6
27.01.2020, 20:13
  • 1
    Хорошее решение. Я предлагаю отметить '|| USE_X = "+ x"' на конце второго выражения, таким образом, можно затем назвать 'набор "$USE_X"', и это будет работать для восстановления установки начальной буквы, был ли xtrace установлен. –  Binary Phile 23.12.2014, 17:14

После чтения страниц справочника и захвата для вещей, вот решение:

$ cat show_x.sh
#!/bin/bash
if [ "$(set | grep xtrace)" ]; then
    echo "xtrace is on. :D"
else
    echo "xtrace is off. :("
fi

Результат:

$ bash show_x.sh 
xtrace is off. :(

$ bash -x show_x.sh 
++ set
++ grep xtrace
+ '[' SHELLOPTS=braceexpand:hashall:interactive-comments:xtrace ']'
+ echo 'xtrace is on. :D'
xtrace is on. :D
4
27.01.2020, 20:13
  • 1
    "набор" покажет Вам все функции и огибающий Вар к, и если какой-либо из тех будет содержать "xtrace", то решение перестанет работать. –  Chris Cogdon 28.06.2017, 18:40

Документы страницы справочника удара set -o xtrace как эквивалентный set -x, который в свою очередь эквивалентен предоставлению -x как аргумент оболочке. (До сих пор это совместимо с SUSv3 sh с протестом это -o option требуется, "если система поддерживает опцию User Portability Utilities".)

Кроме того, set -o без опции печатает текущий статус всего из -o опции. (SUSv3 указывает это также, но не полезно; формат является неуказанным, таким образом, можно только зависеть от него, если Вы знаете о выполнении оболочки, которая использует формат, подобный удару.)

Так, конвейер set -o | grep xtrace | grep -q on должен быть тем, что Вы ищете.

3
27.01.2020, 20:13

Это выражение будет истинным, если сценарий выполняется с -x, ложным - иначе: [[ $- =~ x ]] Таким образом, это выражение будет "-x", если скрипт выполняется с -x, и "" (пустое) в противном случае: $([[ $- =~ x ]]] && echo "-x")

6
27.01.2020, 20:13

Теги

Похожие вопросы