Я хочу передать строку из моего PHP как
<?php
str1="string to pass"#not sure about passthru
?>
И мой tcl
скрипт
set new [exec $str1]#str1 from php
puts $new
Это возможно? Пожалуйста, дайте мне знать, что я застрял с этим
Самый простой механизм — запустить скрипт Tcl как подпроцесс, который запускает принимающий скрипт (который вы, вероятно, поместите в тот же каталог, что и ваш код PHP, или поместите в другое место), который декодирует передаваемые аргументы и который что вам требуется с ними.
Таким образом, на стороне PHP вы могли бы сделать (обратите внимание на важный использование escapeshellarg
Вот! Я советую использовать строки с пробелами в качестве контрольных примеров для проверки правильности цитирования в вашем коде):
<?php
$str1 = "Stack Overflow!!!";
$cmd = "tclsh mycode.tcl " . escapeshellarg($str1);
$output = shell_exec($cmd);
echo $output;
echo $output;
?>
На стороне Tcl, аргументы (после имя скрипта) помещаются в список в глобальном argv
переменная. Скрипт может вытащить их с любым количеством операций со списком. Вот один из способов, с lindex
:
set msg [lindex $argv 0]
# do something with the value from the argument
puts "Hello to '$msg' from a Tcl script running inside PHP."
Другой способ будет использовать lassign
:
lassign $argv msg
puts "Hello to '$msg' from a Tcl script running inside PHP."
Обратите внимание, однако (если вы используете Tcl exec
вызывать подпрограммы), что Tcl автоматически автоматически цитирует аргументы для вас. (На самом деле это делается буквально в Windows по техническим причинам.) Tcl не нужно ничего подобного escapeshellarg
потому что он принимает аргументы в виде последовательности строк, а не одной строки, и поэтому знает больше о том, что происходит.
Другие варианты передачи значений — по переменным среды, по конвейеру, по содержимому файла и по сокету. (Или с помощью чего-то более экзотического.) Общая тема межпроцессного взаимодействия может быть очень сложной на обоих языках, и в этом участвует очень много компромиссов; вам нужно быть очень уверенным в том, что вы пытаетесь сделать в целом, чтобы правильно выбрать вариант.
Это возможно.
test.php
<?php
$str1="Stackoverflow!!!";
$cmd = "tclsh mycode.tcl $str1";
$output = shell_exec($cmd);
echo $output;
?>
mycode.tcl
set command_line_arg [lindex $argv 0]
puts $command_line_arg