Распространен ли синтаксический анализ сценариев во время выполнения сценария на оболочки или присутствует в других интерпретаторах, и как это работает?

Вам необходимо активировать ключ создания, чтобы использовать его. Перейдите в настройки клавиатуры , на вкладку Макеты и нажмите кнопку Параметры ... .

Откроется новое всплывающее окно, в котором вам нужно будет найти параметр Положение клавиши создания , и там у вас будет список клавиш, которые можно включить для этой функции, например alt , ctrl и т. д.


Edit

В Linux ярлыки работают не так, как в Windows.

Представьте, что если вы хотите ввести á , вам нужно нажать alt + ' + a (при условии, что alt - ключ создания).

7
13.06.2018, 19:01
3 ответа

Таким образом, это работает бесконечно в Bash/dash/ksh/zsh (или, по крайней мере, до тех пор, пока ваш диск не заполнится):

#!/bin/sh
s=$0
foo() { echo "hello"; echo "foo" >> $s; sleep.1; }
foo

Следует отметить, что имеет значение только то, что добавлено в файл сценария после последней строки, прочитанной оболочкой. Оболочки не возвращаются назад, чтобы -прочитать более ранние части, чего они даже не могли бы сделать, если бы ввод был каналом.

Подобная конструкция не работает в Perl, она считывает весь файл перед запуском.

#!/usr/bin/perl -l    
open $fd, ">>", $0;
sub foo { print "hello"; print $fd 'foo;' }
foo;

Мы можем видеть, что это происходит и при вводе данных через канал. Это дает синтаксическую ошибку (и только это )через 1 секунду:

$ (echo 'printf "hello\n";' ; sleep 1 ; echo 'if' ) | perl 

В то время как тот же скрипт передается, например,. Bash печатает hello, а через секунду выдает синтаксическую ошибку.

Python похож на Perl с конвейерным вводом, даже несмотря на то, что интерпретатор запускает цикл чтения -eval -печати в интерактивном режиме.


В дополнение к чтению входной строки скрипта -по -строке, как минимум Bash и dash обрабатывают аргументы для evalпо одной строке за раз:

$ cat evaltest.sh
var='echo hello
fi'
eval "$var"
$ bash evaltest.sh
hello
evaltest.sh: eval: line 4: syntax error near unexpected token `fi'
evaltest.sh: eval: line 4: `fi'

Zsh и ksh немедленно выдают ошибку.

Аналогично для исходных скриптов, на этот раз Zsh также запускает строку -за строкой -, так же как Bash и тире:

$ cat sourceme.sh
echo hello
fi
$ zsh -c '../sourceme.sh'
hello
./sourceme.sh:2: parse error near `fi'
2
27.01.2020, 20:18

По крайней мере, одна раковина, рыба, не демонстрирует такого поведения (, но тогда рыба необычна в других отношениях):

% for sh in zsh mksh fish dash bash tcsh; do echo 'sleep 5' > foo.$sh; $sh foo.$sh & sleep 1; echo 'echo $0' >> foo.$sh; fg; done
[2] 7381
[2]  - 7381 running    $sh foo.$sh
foo.zsh
[2] 7385
[2]  - 7385 running    $sh foo.$sh
foo.mksh
[2] 7387
[2]  - 7387 running    $sh foo.$sh
[2] 7390
[2]  - 7390 running    $sh foo.$sh
foo.dash
[2] 7393
[2]  - 7393 running    $sh foo.$sh
foo.bash
[2] 7415
[2]  - 7415 running    $sh foo.$sh
foo.tcsh

(В предыдущей версии этого ответа были ошибочные наблюдения за Python и Ruby.)

1
27.01.2020, 20:18

Эта функция присутствует и в других интерпретаторах, которые предлагают то, что называетсяreadevalprintloop. LISP — довольно старый язык с такой возможностью, и в Common LISP есть функция read, которая будет читать здесь выражение (+ 2 2), которое затем может быть передано в evalдля оценки (, хотя в реальном коде вы можете не хочу делать это таким образом по различным соображениям безопасности):

% sbcl
* (defparameter sexp (read))
(+ 2 2)

SEXP
* (print (eval sexp))

4
4

мы также можем определить наш собственный очень простой REPL без особых функций, отладки или почти чего-либо еще, но здесь показаны части REPL:

* (defun yarepl () (loop (print (eval (read))) (force-output) (fresh-line)))

YAREPL
* (yarepl)
(* 4 2)

8
(print "hi")

"hi"
"hi"

В основном, как указано на паспортной табличке, данные считываются, оцениваются, распечатываются, а затем (при условии, что ничего не сломалось, и есть электричество или что-то еще, питающее устройство )он возвращается к считыванию Нет необходимости в сборке AST заранее. (SBCL нуждается в дополнениях force-outputи fresh-lineдля отображения, другие реализации Common LISP могут или не могут.)

Другие вещи с REPL включают TCL («оболочку, укушенную радиоактивным LISP» ), которая включает графические элементы с Tk

% wish
wish> set msg "hello"
hello
wish> pack [label.msg -textvariable msg]
wish> wm geometry. 500x500
wish> exit

Или ВПЕРЕД здесь, чтобы определить функцию f>cдля преобразования температуры ("ok" добавляетсяgforth):

% gforth
Gforth 0.7.3, Copyright (C) 1995-2008 Free Software Foundation, Inc.
Gforth comes with ABSOLUTELY NO WARRANTY; for details type `license'
Type `bye' to exit
: f>c ( f -- c ) 32 - 5 9 */ cr. cr ;  ok
-40 f>c
-40
 ok
100 f>c
37
 ok
bye
3
27.01.2020, 20:18

Теги

Похожие вопросы