как передать параметр командной строки, содержащий '<' в 'exec' - PullRequest
2 голосов
/ 13 августа 2011
$ date > '< abcd'
$ cat '< abcd'
<something>
$ tclsh8.5
% exec cat {< abcd}
couldn't read file " abcd": no such file or directory

возгласы. Это связано со спецификацией exec.

Если arg (или пара аргументов) имеет одну из форм, описанных ниже, то он используется exec для управления потоком ввода и вывода среди подпроцесса (ов). Такие аргументы не будут переданы подпроцессу (-ам). В таких формах, как «

Есть ли способ обойти это?

Ответы [ 4 ]

4 голосов
/ 15 августа 2011

Должно ли значение передаваться в качестве аргумента?Если нет, вы можете использовать что-то вроде этого:

set strToPass "< foo"
exec someProgram << $strToPass

Для имен файлов вы можете (почти всегда) вместо этого передавать полностью определенное имя.Полное имя можно получить с помощью file normalize:

exec someProgram [file normalize "< foo"]       ;# Odd filename!

Но если вам нужно , чтобы передать аргумент, где < (или >) - первый символзастрялКоманда exec всегда использует такие аргументы, как перенаправления;в отличие от оболочки Unix, вы не можете просто использовать кавычки, чтобы обойти ее.

Но вы можете использовать вспомогательную программу.Таким образом, в Unix вы можете сделать это:

exec /bin/sh -c "exec someProgram \"$strToPass\""

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

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

2 голосов
/ 14 августа 2011

Одно простое решение: убедитесь, что слово не начинается с символа перенаправления:

exec cat "./< abcd"

Еще немного сложнее:

exec sh -c {cat '< abcd'}

# also
set f {< abcd}
exec sh -c "cat '$f'"

Это страница на Tcl Wiki немного говорит о проблеме.

0 голосов
/ 13 августа 2011

Попробуйте:

set myfile "

exec cat $ myfile

0 голосов
/ 13 августа 2011

Вы пробовали это?

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