W wersji bash4.1 i nowszej możesz to zrobić
BASH_XTRACEFD=7 ./script.bash 7> /dev/null
(działa również, gdy bashzostanie wywołany jako sh).
Zasadniczo mówimy, bashaby wyświetlać dane xtracewyjściowe na deskryptorze pliku 7 zamiast wartości domyślnej 2 i przekierować ten deskryptor pliku na /dev/null. Numer fd jest dowolny. Użyj fd powyżej 2, który nie jest inaczej używany w twoim skrypcie. Jeśli powłoka, w której wpisujesz to polecenie, to bashlub yash, możesz nawet użyć liczby powyżej 9 (chociaż możesz napotkać problemy, jeśli deskryptor pliku jest używany wewnętrznie przez powłokę).
Jeśli powłoka, z której wywołujesz ten bashskrypt zsh, to możesz także:
(export BASH_XTRACEFD; ./script.bash {BASH_XTRACEFD}> /dev/null)
aby zmienna była automatycznie przypisywana pierwszej wolnej wartości fd powyżej 9.
W starszych wersjach bashinną opcją, jeśli xtracezostanie włączony za pomocą set -x(w przeciwieństwie do #! /bin/bash -xlub set -o xtrace) byłoby przedefiniowanie setjako wyeksportowanej funkcji, która nic nie robi po przekazaniu -x(choć to zepsułoby skrypt, jeśli on (lub inny bashskrypt, który wywołuje) służy setdo ustawiania parametrów pozycyjnych).
Lubić:
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
Inną opcją jest dodanie pułapki DEBUG do $BASH_ENVpliku, który działa set +xprzed każdym poleceniem.
echo 'trap "{ set +x; } 2>/dev/null" DEBUG' > ~/.no-xtrace
BASH_ENV=~/.no-xtrace ./script.bash
To nie zadziała, gdy set -xzostanie wykonane w podpowłoce.
Jak powiedział @ilkkachu, pod warunkiem, że masz uprawnienia do zapisu w dowolnym folderze w systemie plików, powinieneś być przynajmniej w stanie wykonać kopię skryptu i edytować go.
Jeśli nie ma gdzie napisać kopii skryptu, lub jeśli nie jest wygodne tworzenie i edytowanie nowej kopii za każdym razem, gdy pojawi się aktualizacja oryginalnego skryptu, nadal możesz zrobić:
bash <(sed 's/set -x/set +x/g' ./script.bash)
To (i podejście do kopiowania) może nie działać poprawnie, jeśli skrypt robi coś wymyślnego $0lub specjalne zmienne, takie jak $BASH_SOURCE(np. Szukanie plików, które są względne względem położenia samego skryptu), więc może być konieczne wykonanie dalszej edycji, takiej jak zastąp $0ścieżką skryptu ...
./script 2>some_file