З 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