Перейти к содержанию

5. Ввод, вывод и системные команды

← Управляющие конструкции и функции · Оглавление · Далее: типы данных и методы →

print <значение> выводит значение в стандартный вывод. Перевод строки автоматически не добавляется. println <значение> выводит значение и добавляет перевод строки.

print "Hello"
println ", world!"

read

read читает одну строку из стандартного ввода. Если тип не указан, возвращается String.

print "Name: "
$name = read
println "Hello, " + $name

С приведением типа:

print "Age: "
$age = read Integer
println "Next year: " + ($age + 1)

Поддерживаются String, Path, Integer, Number, Decimal, Boolean, а также Java-класс или псевдоним Java-класса.

exit

exit <код> завершает выполнение сценария с указанным кодом. Перед завершением выполняются активные defer.

if $failed {
    exit 1
}

exec

exec(...) запускает системную утилиту и возвращает объект ExecuteResult.

$pattern = "hello"
$file = "file.txt"
$result = exec( grep -i $pattern $file )

if $result.code == 0 {
    print $result.out
} else {
    print $result.err
}

Поля ExecuteResult:

Поле Тип Описание
command String Выполненная команда в читаемом виде.
out String Стандартный вывод команды.
err String Стандартный поток ошибок.
code Integer Код завершения процесса.

Важное отличие от shell

exec не запускает shell и не склеивает аргументы в одну строку. Первый аргумент — имя утилиты, остальные передаются процессу как отдельные аргументы.

Это значит, что ;, &&, кавычки и пробелы внутри переменной не получают специального shell-смысла.

$unsafe-looking = "hello; rm -rf /"
$result = exec( printf "%s" $unsafe-looking )
println $result.out

Распаковка списка аргументов

...$list распаковывает список, iterable или массив в отдельные аргументы процесса.

$sources = ["src/Main.java", "src/Util.java"]
$result = exec( javac -d out ...$sources )
println "exit=" + $result.code

Передача stdin через |

Слева от | может быть String или ExecuteResult. Справа должен быть exec(...).

$result = "hello\nworld\n" | exec( grep hello )
print $result.out

Можно строить цепочки:

$archive = exec( tar -tf archive.tar )
$filtered = $archive | exec( grep README )
print $filtered.out

Если утилита не найдена или процесс не удалось запустить, интерпретатор выбрасывает исключение.

← Управляющие конструкции и функции · Оглавление · Далее: типы данных и методы →