Czy podczas uruchamiania z -x
opcją możliwe jest wyłączenie poszczególnych poleceń z echa?
Staram się, aby wynik był jak najbardziej schludny, więc uruchamiam niektóre części mojego skryptu w podpowłoce set +x
. Jednak set +x
sam wiersz jest nadal powtarzany i nie dodaje żadnych cennych informacji do wyniku.
Pamiętam, że w dawnych, złych .bat
czasach, kiedy biegałem echo on
, poszczególne linie mogły być zwolnione, zaczynając je od @
. Czy jest jakiś odpowiednik w bash?
#!/bin/bash -x
function i_know_what_this_does() {
(
set +x
echo do stuff
)
}
echo the next-next line still echoes 'set +x', is that avoidable?
i_know_what_this_does
echo and we are back and echoing is back on
Po uruchomieniu powyższego dane wyjściowe to:
+ echo the next-next line still echoes 'set +x,' is that 'avoidable?'
the next-next line still echoes set +x, is that avoidable?
+ i_know_what_this_does
+ set +x
do stuff
+ echo and we are back and echoing is back on
and we are back and echoing is back on
Powodem, dla którego
set +x
jest drukowane jest to, żeset -x
„wypisz polecenie, które zamierzasz uruchomić, z rozszerzeniami, przed uruchomieniem . Więc powłoka nie wie, że chcesz, aby nie drukowała rzeczy, dopóki nie wydrukuje wiersza z informacją, że nie drukować. Według mojej najlepszej wiedzy nie ma sposobu, aby temu zapobiec.źródło
Oto rozwiązanie, którego szukałeś:
Oryginalne polecenie jest wykonywane w tej samej powłoce z transformacją tożsamości. Tuż przed uruchomieniem otrzymujesz nierekurencyjny xtrace argumentów. Pozwala to na śledzenie poleceń, które są dla Ciebie ważne, bez spamowania operatora za pomocą duplikatów kopii każdego polecenia „echo”.
źródło
perl
(i problemów z poleceniami wieloliniowymi):+() { :;} 2> /dev/null; xtrace() { (PS4=; set -x; + "$@";{ set +x; } 2> /dev/null); "$@";}
set -x
manewry kupują mi coś w porównaniu do zwykłychprintf >&2 '+ %s\n' "$*"
?xtrace() { printf >&2 '+ %s\n' "$*"; "$@"; }