Użyj TUTAJ pliku i przekieruj wyjście polecenia

11

Mam następujący kod w skrypcie wsadowym:

mpirun -np 6 ./laplace <<END
100
100
100
0.01
100
3
2
1
END
| tail -n 1 > output

Ale to nie działa. Chcę to zrobić, używając pliku TUTAJ jako danych wejściowych do polecenia mpirun, a następnie przesłać dane wyjściowe do polecenia tail. Myślę jednak, że TUTAJ plik wyjściowy i dane wyjściowe są mylące.

Jak mam to napisać, aby robiło to, co chcę?

robintw
źródło

Odpowiedzi:

12

To, co napisałeś w pierwszym wierszu, wygląda jak kompletne polecenie („lista (złożona)” w terminologii powłoki), więc powłoka traktuje to jako kompletne polecenie. Ponieważ jest tu znacznik rozpoczęcia dokumentu ( <<END), powłoka odczytuje zawartość dokumentu tutaj, a następnie uruchamia nowe polecenie. Jeśli chcesz umieścić dokument tutaj na środku listy, musisz wskazać powłoce, że lista nie jest ukończona. Oto kilka sposobów.

mpirun -np 6 ./laplace <<END |

END
tail -n 1 > output
{ mpirun -np 6 ./laplace <<END

END
} | tail -n 1 > output

Lub oczywiście możesz upewnić się, że polecenie całkowicie mieści się w pierwszym wierszu.

mpirun -np 6 ./laplace <<END | tail -n 1 > output

END

Zasadą, o której należy pamiętać, jest to, że treść dokumentu zaczyna się po pierwszej niecytowanej nowej linii po <<ENDwskaźniku. Na przykład, oto inny zaciemniony sposób pisania tego skryptu:

mpirun -np 6 ./laplace <<END \
| tail -n $(

END
             echo 1) > output
Gilles „SO- przestań być zły”
źródło
Ten ostatni! „zaciemniony” .. Nie żartujesz! :) .. Natknąłem się na pomysł nowej linii, ale tak naprawdę podzielenie takiego nawiasu blokowego graniczy z bizzare .. Czy to z założenia, czy to przypadkowa abberacja ?. (np. czy jest to naprawdę przydatne? ... i można nawet umieścić wiele oddzielnych
średników
@fred: Po prostu przypadkowa aberracja. Musi istnieć pewna zasada, od której zaczyna się i kończy heredok. Tutaj reguła jest taka, że ​​heredoc jest jak pojedynczy token dołączony do następnego tokena nowej linii po <<ENDbicie. Odwrotny ukośnik-nowa linia unieważnia nową linię.
Gilles „SO - przestań być zły”
7
mpirun -np 6 ./laplace <<END | tail -n 1 > output
100
100
100
0.01
100
3
2
1
END
nic
źródło