W wersji bash
4.1 i nowszej możesz to zrobić
BASH_XTRACEFD=7 ./script.bash 7> /dev/null
(działa również, gdy bash
zostanie wywołany jako sh
).
Zasadniczo mówimy, bash
aby wyświetlać dane xtrace
wyjś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 bash
lub 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 bash
skrypt 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 bash
inną opcją, jeśli xtrace
zostanie włączony za pomocą set -x
(w przeciwieństwie do #! /bin/bash -x
lub set -o xtrace
) byłoby przedefiniowanie set
jako wyeksportowanej funkcji, która nic nie robi po przekazaniu -x
(choć to zepsułoby skrypt, jeśli on (lub inny bash
skrypt, który wywołuje) służy set
do 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_ENV
pliku, który działa set +x
przed 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 -x
zostanie 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 $0
lub 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