Почему я получаю сообщение об ошибке при использовании «source» для запуска сценария TCL? - PullRequest
0 голосов
/ 22 февраля 2020

Я сейчас работаю над сценариями TCL . Когда я запускаю tclsh script.tcl, скрипт работает отлично, но когда я запускаю source script.tcl, команды больше не найдены.

#!/usr/bin/env tclsh
proc test {} {
  set a 43
  set b 27
  set c [expr $a + $b]
  set d [expr [expr $a - $b]* $c]
  for {set k 0} {$k < 10} {incr k} {
    if {$k < 5} {
      puts "k<5, pow=[expr pow($d,$k)]"
    } else {
      puts "k>=5, mod=[expr $d % $k]"
    }
  }
}

..., что при запуске вызывает ошибку:

$ source myfirst.tcl

Command 'proc, not found, did you mean:

  command 'croc' from snap croc (6.4.10)
  command 'prof' from deb profphd
  command 'nproc' from deb coreutils
  command 'proj' from deb proj-bin

See 'snap info <snapname>' for additional versions.

bash: myfirst.tcl: line 7: syntax error near undexpected token `k'

Ответы [ 2 ]

1 голос
/ 22 февраля 2020

Код Tcl запускается интерпретатором Tcl (обычно tclsh или wish, но многие приложения также поддерживают Tcl). Bash код запускается интерпретатором bash. Эти два языка имеют исключительно поверхностное сходство; команда source является одной из них, но proc - это команда только для Tcl (вместо bash вместо этого используется function).

Это означает, что все, что запускается source Команда также должна понимать, в чем записан целевой файл.

1 голос
/ 22 февраля 2020

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

То есть на bash source можно использовать только для запуска сценариев bash. Он не может запускать сценарии TCL. Это по своей природе: source делает пропускает запуск дополнительной оболочки или другого интерпретатора (таким образом, заставляя игнорировать ваш #!/usr/bin/env tclsh shebang), и запускает код в оболочке, которую вы уже в.

Если эта оболочка не может выполнить собственный синтаксический анализ языка, на котором написан исходный текст сценария, следует ожидать синтаксических ошибок - содержимое, написанное на одном языке, анализируется интерпретатором, предназначенным исключительно для поддержать другой. Префикс bash: в вашем сообщении об ошибке дает понять, что это так на практике; bash, а не tclsh, пытается интерпретировать сценарий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...