2014-11-07 37 views
5

Piszę skrypt w J dla systemu Linux z #!Ciąg wejściowy w skrypcie J zawiesza się

Ale skrypt się zawiesił. Po skrypcie Control-D echo wprowadzonej wartości. Ale zwykły ENTER tylko umieszcza kursor na nowej linii.

#!/path/jconsole 

a =. 1!:1]3 
echo a 
exit '' 
+0

Znalazłem brzydką sztuczkę: 'a =. shell "przeczytaj foo; echo -n $ foo'' –

Odpowiedz

2

Chodzi o to, że (1!:1)&3 czyta do "końca pliku". W systemie Linux naciśnięcie ctrl-D wysyła sygnał EOF.

Jeśli to nie to, czego szukasz, obawiam się, że nie ma nic innego ale twój „brzydki trik”

a=. shell 'read foo; echo -n $foo' 

jako (1: 1) & 1 działa tylko podczas sesji z jakiegoś powodu ...

3

Nie można odczytać pojedynczego wiersza tekstu, gdy j jest w trybie skryptowym, ale można zaplanować coś do uruchomienia następnym razem, gdy j powróci do trybu natychmiastowego wykonania, ustawiając frazę immex na 9!:27 a następnie ustawienie bitu immex na 1 za pomocą 9!:29. Oto przykład:

#!/usr/bin/env j 

NB. demo showing how to make a simple repl in j. 

readln =: [: (1!:01) 1: 
donext =: [: (9!:29) 1: [ 9!:27 

main =: verb define 
    echo '' 
    echo 'main loop. type ''bye'' to exit.' 
    echo '--------------------------------' 
    while. (s:'`bye') ~: s:<input=:readln'' do. 
    echo ".input 
    end. 
    echo '--------------------------------' 
    echo 'loop complete. returning to j.' 
    NB. or put ( exit'') here to exit j. 
) 

donext 'main _'