#!/bin/bash
function0()
{
local t1=$(exit 1)
echo $t1
}
function0
echo
wyświetla pustą wartość. Oczekiwałem:
1
Dlaczego t1
zmienna nie otrzymuje wartości zwracanej przez komendę exit - 1
?
bash
shell
variable
command-substitution
Gilles „SO- przestań być zły”
źródło
źródło
$(trap 'printf "::ERRNO:$?"' 0; # now do whatever however
Kod wyjścia został zapisany w $? zmienna. Używanie podstawiania poleceń tylko do przechwytywania danych wyjściowych, należy użyć (...), aby utworzyć podpowłokę :
źródło
t1=$?
jest wykorzystanie go, nie? i czy nie dałoby$?
się zapchać opcją przydziału? Chyba pytam, czy nie powinno byćprintf '%d\n' "${t1}"
W
bash
tym działa:Ma to związek z kolejnością oceny poleceń i przypisywaniem zmiennych.
local
ma własną wartość zwracaną - i jest to aktualnie wykonywane polecenie, a nie podstawienie polecenia. Przyczyna takich rzeczy jak ...... może zwrócić 1, ponieważ nigdy nie ma powrotu w tej komendzie, z wyjątkiem uruchomienia podpowłoki w celu przypisania
$x
wartości - więc$?
nie ulega zablokowaniu, jak ma to miejsce praktycznie w każdym innym przypadku, w którym stosowane są podstawienia komend.W każdym razie, ze
local
to ma dostać niszczona - ale jeśli złapiesz go w odpowiednim momencie - który jest jednocześnie ekspansje są nadal oceniane i przedlocal
„s procedury mają szansę go sprać - nadal można przypisać go.... drukuje ...
Powinieneś jednak wiedzieć, że w wielu powłokach nie możesz polegać na
$?
ustawieniu w połowie oceny w ten sposób. W rzeczywistości jest tak prawdopodobnie dlatego, że te powłoki nie przeszkadzają w ponownej ocenie w każdym możliwym momencie, jak być możebash
- co, moim zdaniem, jest prawdopodobnie lepszym zachowaniem niżbash
jego. Czy naprawdę chcesz, aby Twój interpreter rekurencyjnie sprawdzał wartości, które najprawdopodobniej zostaną nadpisane, zanim będziesz miał okazję ich użyć?W każdym razie tak możesz to zrobić.
źródło
W zależności od tego, dlaczego próbujesz po prostu uzyskać kod wyjścia, możesz również uruchomić,
if some-command; then echo "Success $?"; else echo "Failure $?"; fi
który nie robi nic z wynikiem polecenia, po prostu ocenia kod wyjścia uruchomienia polecenia. Możesz dodaćor
(or
$ (around the command and you'll still get the same results. A better example might be
jeśli grep -q 'somestring' somefile; następnie powtórz echo: „Znaleziono kod wyjścia somestring to $?”; W innym przypadku „Nie znalazłeś kodu wyjścia somestring to $?”; Fi`.Możesz również przetestować kod powrotu funkcji, który może być jawnym
return 3
lub dorozumianym kodem powrotu, który jest wynikiem ostatniego polecenia, w takim przypadku musisz uważać, aby nie miećecho
na końcu funkcja, w przeciwnym razie maskuje / resetuje poprzedni kod wyjścia.Wreszcie brudna sztuczka, ponieważ nie możesz tego zrobić,
VAR=(SOME_COMMAND)
ponieważVAR=()
jest to definicja tablicy, więc musiszVAR=( $(echo 'Some value') )
.źródło