TL; DRWyświetlanie lub przekierowujące komunikaty sterujące praca skorupę za
Wszystko kontrola pracy/zderzeniowe wiadomości są ukryte, gdy występują one w obrębie funkcji. Pójdę do bardziej szczegółowo poniżej, ale @Barmar wskazał, że ten problem może być powielana uruchamiając upaść binarnego wewnątrz funkcji, np:
crun() {
/tmp/faulty $1 $2 $3
}
Mam zdefiniowano funkcję w moim .zshrc
do skompilować kod źródłowy & biegać z funkcji poniżej:
crun() {
local file=$1
shift
local exepath="$(mktemp)"
if [[ $file =~ "\.c$" ]]; then
gcc -g -Wall $file -o $exepath || return $?
else
echo "no filetype detected"
return 126
fi
$exepath "[email protected]"
}
który można nazwać w ten sposób:
% crun source.cc arg_1 arg_2
Działa to w przypadku zwykłych programów, ale ma problem z tym, że komunikaty sterowania zadaniami powłoki, takie jak te generowane z segfault, nie pojawiają się.
Jako przykład:
% echo 'int main=0;' >> /tmp/faulty.C# a crashing c program
% crun faulty.c
% # no output generated
Zważywszy równoważnych interaktywnych poleceń by wygenerować to:
% g++ faulty.c -o /tmp/faulty && /tmp/faulty
[1] 2894 segmentation fault (core dumped) # zsh's job control output for SIGSEGV
Czy istnieje jakiś sposób, aby wyświetlać te wiadomości o awarii wykonywalnego, którego ścieżka jest dynamicznie obliczane? Idealnie bez pisania własnych procedur obsługi pułapka/sygnałowe + exec
korzystając sh -c "$exepath [email protected]"
lub pisząc zupełnie nowy system(3)
opakowanie całkowicie)
Nie rozumiem tego na bok. Mówisz, że działa poprawnie podczas uruchamiania 'crun' wewnątrz samej powłoki. Jak inaczej działasz, gdy to nie działa? – Barmar
@Barmar Masz rację, to było całkowicie zagmatwane, usunąłem to. Zasadniczo * można * uzyskać komunikaty sterowania zadaniami, uruchamiając 'crun' wewnątrz innego pliku i uruchamiając wygenerowany plik binarny za pomocą' exec' (ponieważ obraz procesu powłoki jest zamieniany na program, który zawiera błędy, które przechwytuje nadrzędna powłoka)). Uwzględniłem tylko kwestię różnicy między wykonaniem interaktywnym i nieinteraktywnym oraz jak to może być istotne. –
Kiedy próbuję twojej funkcji, zawsze otrzymuję komunikat "Nie wykryto rodzaju pliku" - wystąpił problem z 'if'. Kiedy to wyjmuję, otrzymuję komunikat o uszkodzeniu segmentacji od powłoki. – Barmar