Poniższy wiersz tworzy, file_c-6.txt
ale generuje 5
:
$ i=5; ls file_a-${i}.txt file_b-${i}.txt > file_c-$(( ++i )).txt; echo $i
5
$ cat file_c-6.txt
file_a-5.txt
file_b-5.txt
Jeśli ktoś usunie >
to wyświetli file_c-6.txt
i wyświetli 5
:
Nie rozumiem, dlaczego nie zachowuje wartości z i
pierwszego przykładu.
$ i=5; ls file_a-${i}.txt file_b-${i}.txt file_c-$(( ++i )).txt; echo $i
file_a-5.txt file_b-5.txt file_c-6.txt
6
echo
zamiastls
, to działa w drugą stronę w obu przypadkach./bin/echo
zachowuje różnicę, więc wydaje się, że przekierowania wyjściowe dla poleceń zewnętrznych odbywają się w podpowłoce.Odpowiedzi:
Jeśli uruchomisz to pod kontrolą, zobaczysz, że używana wersja
ls
uruchamia polecenie w podpowłoce, gdzie wersja, która używa echa, wykonuje to wszystko w istniejącej powłoce.Porównaj dane wyjściowe z
przeciwko
Zobaczysz w pierwszym:
A w drugim:
W tym ostatnim przykładzie widzisz
clone
nowy proces (od 1258 -> 1259), więc teraz jesteśmy w podprocesie. Otwarcie file_c-6.txt, co oznacza, że oceniliśmy$((++i))
w podpowłoce, i wykonaniels
z jego standardowym ustawieniem tego pliku.W końcu widzimy, że podproces kończy się, zbieramy dziecko, a następnie kontynuujemy od miejsca, w którym przerwaliśmy ... z
$i
ustawionym na 5, i to znowu odbijamy echem.(Pamiętaj, że zmiany zmiennych w podprocesie nie przenikają do procesu nadrzędnego, chyba że zrobisz coś w rodzicu, aby pobrać zmiany podrzędne)
źródło
i=5; j=$(( i + 1 )); ls file_a-${i}.txt file_b-${i}.txt > file_c-${j}.txt; i=${j}; echo $i
.