Я встретился с этой проблемой во встроенной системе Linux, которая должна была обработать даты в прошлом 2038 в некоторых долгосрочных криптографических сертификатах, таким образом, я скажу, что likehood этого зависит от Вашего домена приложения.
В то время как большинство систем должно быть готово задолго до 2038 при нахождении сегодня дат далеко в будущее у Вас может быть проблема.
Только посмотрите $-
переменная.
USE_X=`case "$-" in *x*) echo "-x" ;; esac`
(Да, мне действительно удавалось сделать это, не вызывая grep. Сохраните pids!)
Вероятно, самый простой способ проанализировать $-
, подобный методу dagbrown (также чистый bash
), но без использования case
и обратные галочки (подоболочка):
if [[ ${-/x} != $- ]] ; then USE_X="-x"; fi
или еще короче:
[[ ${-/x} != $- ]] && USE_X="-x"
Отметьте это [[
не вызов test
встроенная программа (как имеет место с [
), но конструкция синтаксиса удара (согласно man bash
и эта dev рекомендация). Таким образом, я утверждаю этого быть "более чистым ударом" ;)
После чтения страниц справочника и захвата для вещей, вот решение:
$ 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
Документы страницы справочника удара set -o xtrace
как эквивалентный set -x
, который в свою очередь эквивалентен предоставлению -x
как аргумент оболочке. (До сих пор это совместимо с SUSv3 sh с протестом это -o option
требуется, "если система поддерживает опцию User Portability Utilities".)
Кроме того, set -o
без опции печатает текущий статус всего из -o
опции. (SUSv3 указывает это также, но не полезно; формат является неуказанным, таким образом, можно только зависеть от него, если Вы знаете о выполнении оболочки, которая использует формат, подобный удару.)
Так, конвейер set -o | grep xtrace | grep -q on
должен быть тем, что Вы ищете.
Это выражение будет истинным, если сценарий выполняется с -x
, ложным - иначе: [[ $- =~ x ]]
Таким образом, это выражение будет "-x", если скрипт выполняется с -x
, и "" (пустое) в противном случае: $([[ $- =~ x ]]] && echo "-x")
*x*
расшириться до? – bbaja42 03.10.2011, 09:55case $- in *x*) USE_X="-x";; *) USE_X=;; esac
@bbaja42 Это ни до чего не расширяется: это - шаблон что строка$-
подобран против. спасибо – Gilles 'SO- stop being evil' 04.10.2011, 00:08*) USE_X=;;
изменения ничто, еслиUSE_X
не был установлен ранее. Кроме того, целоеcase
конструкция является ненужной (см. мою версию - разве, который не более прост?) – rozcietrzewiacz 04.10.2011, 19:12USE_X
был инициализирован раньше. Я не считаю Вашу версию более простой: это - несколько символов короче (и даже затем, только еслиUSE_X
был инициализирован, иначе это длиннее), но за счет ясности и мобильность. мобильность – Gilles 'SO- stop being evil' 04.10.2011, 20:11USE_X
не необходимо в целях надлежащего использования OP (для передачи$USE_X
к дальнейшим сценариям). Используяcase
создайте взгляды, менее ясные и естественные, чем регулярная оценка условия, по моему мнению. – rozcietrzewiacz 04.10.2011, 20:53