С bash
4.1 и выше, вы можете сделать
BASH_XTRACEFD=7 ./script.bash 7> /dev/null
(также работает, когда bash
вызывается как sh
).
По сути, мы говорим bash
вывести xtrace
выходные данные по дескриптору файла 7 вместо значения по умолчанию 2 и перенаправить этот дескриптор файла в /dev/null
. Число FD является произвольным. Используйте fd выше 2, который иначе не используется в вашем скрипте. Если оболочка, в которую вы вводите эту команду, - это bash
или yash
, вы можете даже использовать число выше 9 (хотя вы можете столкнуться с проблемами, если дескриптор файла используется внутри оболочки).
Если оболочка, из которой вы вызываете этот bash
скрипт zsh
, вы также можете сделать:
(export BASH_XTRACEFD; ./script.bash {BASH_XTRACEFD}> /dev/null)
для переменной, которой автоматически присваивается первый свободный fd выше 9.
Для более старых версий bash
, другой вариант, если xtrace
он включен с set -x
(в отличие от #! /bin/bash -x
или set -o xtrace
), будет переопределять set
как экспортированную функцию, которая ничего не делает при передаче -x
(хотя это сломало бы скрипт, если он (или любой другой bash
скрипт, который он вызывает) используется set
для установки позиционных параметров).
Подобно:
set()
case $1 in
(-x) return 0;;
(-[!-]|"") builtin set "$@";;
(*) echo >&2 That was a bad idea, try something else; builtin set "$@";;
esac
export -f set
./script.bash
Другой вариант - добавить ловушку DEBUG в $BASH_ENV
файл, который выполняется set +x
перед каждой командой.
echo 'trap "{ set +x; } 2>/dev/null" DEBUG' > ~/.no-xtrace
BASH_ENV=~/.no-xtrace ./script.bash
Это не будет работать, когда set -x
это делается в под-оболочке.
Как сказал @ilkkachu, если у вас есть разрешение на запись в любую папку в файловой системе, вы, по крайней мере, сможете сделать копию сценария и отредактировать его.
Если вы нигде не можете написать копию сценария или если вам неудобно создавать и редактировать новую копию каждый раз, когда происходит обновление исходного сценария, вы все равно можете сделать следующее:
bash <(sed 's/set -x/set +x/g' ./script.bash)
Это (и подход к копированию) может не работать должным образом, если сценарий выполняет какие- либо действия с $0
такими специальными переменными, как $BASH_SOURCE
(например, поиск файлов, относящихся к местоположению самого сценария), поэтому вам может потребоваться выполнить еще какое-то редактирование, например заменить $0
на путь сценария ...
./script 2>some_file