З bash4.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