Как точно работает TCL Exec? -- exec поле с участием tcl пол Связанный проблема

How does tcl exec work exactly?


0
vote

проблема

русский

Я автоматизирующую работу, которая требует вызова <код> tcpdump -nn -tt -r на некоторых файлах .pcap.

Для этого я использую следующий код TCL:

 <код> set magic_dir "results/pcap/"; set magic_filename "data" set magic_node_count 16 set magic_command "tcpdump"  for {set i 0} {$i <= $magic_node_count} {incr i}    {     set filename "${magic_dir}${magic_filename}-${i}-0.pcap"     if {[file exists $filename]}        {         set dest_dir "${magic_dir}../tmp/tmp_${i}"         exec ${magic_command} -nn -tt -r ${filename} > ${dest_dir}       }    }   

Это работает (первый файл преобразуется), но TCL сообщает об ошибке в этой строке. То же самое происходит позже в сценарии, когда пытаюсь использовать GREP. Я избегаю этого, используя <код> catch , но я хотел бы знать, как правильно использовать эту команду.

Английский оригинал

I am automating some work that requires calling tcpdump -nn -tt -r on some .pcap files.

To do this I"m using the following tcl code:

set magic_dir "results/pcap/"; set magic_filename "data" set magic_node_count 16 set magic_command "tcpdump"  for {set i 0} {$i <= $magic_node_count} {incr i}    {     set filename "${magic_dir}${magic_filename}-${i}-0.pcap"     if {[file exists $filename]}        {         set dest_dir "${magic_dir}../tmp/tmp_${i}"         exec ${magic_command} -nn -tt -r ${filename} > ${dest_dir}       }    } 

This works (the first file gets converted) but tcl reports an error in that line. The same thing happens later on in the script when I attempt to use grep. I avoid this by using catch but I would like to know how to properly use this command.

</div
     
     
     

Список ответов

2
 
vote
vote
Лучший ответ
 

По умолчанию, TCL <код> exec генерирует ошибку, если либо

  1. Команда имеет ненулевой код выхода или
  2. Команда производит вывод на своем стандартном канале ошибок.

Из этих двух, вам в значительной степени приходится обращаться с первым, используя <код> catch (или <код> try / <код> trap в tcl 8.6), поскольку это почти всегда настоящая ошибка. (Или нет; <код> grep - это классическая проблема.) Но со стандартной обработкой ошибок у вас есть больше вариантов (предполагая, что вы Использование 8.5 ).

Например, вы можете перенаправить к терминалу:

 <код> exec ${magic_command} -nn -tt -r ${filename} > ${dest_dir} 2>/dev/tty   

или к нормальному стандартному каналу ошибки:

 <код> exec ${magic_command} -nn -tt -r ${filename} > ${dest_dir} 2>@stderr   

или вы можете просто сказать TCL, чтобы выбросить его:

 <код> exec -ignorestderr ${magic_command} -nn -tt -r ${filename} > ${dest_dir}   

или даже объединить его на стандартный выход:

 <код> exec ${magic_command} -nn -tt -r ${filename} > ${dest_dir} 2>@1   

Вы можете получить больше экзотических, представляя дополнительные трубопроводы (например, с 8,6 <код> chan pipe или через сложность с внешним <код> catch0 ), но это начинает получать Действительно усложняется быстро. Поскольку вы автоматизируете TCPDUMP, вы вполне можете быть лучшим, просто объединяя все в одну и работаю с этим. Или использование значительно большей мощности и сложности ожидаемого пакета.

 

By default, Tcl's exec generates an error if either

  1. The command has a non-zero exit code, or
  2. The command produces output on its standard error channel.

Of these two, you pretty much have to handle the first by using catch (or try/trap in Tcl 8.6) since that's almost always a genuine error. (Or not; grep is a classic problem.) But with standard error processing, you've got more options (assuming you're using 8.5).

For example, you can redirect to the terminal:

exec ${magic_command} -nn -tt -r ${filename} > ${dest_dir} 2>/dev/tty 

or to the normal standard error channel:

exec ${magic_command} -nn -tt -r ${filename} > ${dest_dir} 2>@stderr 

or you can just tell Tcl to throw it away:

exec -ignorestderr ${magic_command} -nn -tt -r ${filename} > ${dest_dir} 

or even combine it into the standard output:

exec ${magic_command} -nn -tt -r ${filename} > ${dest_dir} 2>@1 

You can get more exotic by introducing extra pipelines (e.g., with 8.6's chan pipe or through trickiness with an external cat -u) but that starts to get really complicated fast. Since you're automating tcpdump, you may well be best off just combining everything into one and working with that. Or using considerably-greater power and sophistication of the Expect package.

</div
 
 
 
 

Связанный проблема

1  Бегущий пучок Exec в Eclipse  ( Running bundle exec in eclipse ) 
Может кто-нибудь, пожалуйста, помогите мне с шагами для запуска Bundle Exec в Eclipse IDE. Вот команда, которую я пытаюсь выполнить через Eclipse <код> bund...

0  Как создать UDF, который принимает строку запроса и возвращает результаты запроса  ( How to create a udf that takes a query string and returns the querys resultset ) 
Я хочу создать сохраненную процедуру, которая принимает простой выберите оператор и вернуть результаты в качестве строки CSV. Таким образом, основная идея - п...

43  Как порождать параллельные дочерние процессы на многопроцессорной системе?  ( How to spawn parallel child processes on a multi processor system ) 
У меня есть сценарий Python, который я хочу использовать в качестве контроллера к другому сценарию Python. У меня есть сервер с 64 процессорами, поэтому хочу ...

1  C: `Написать ошибку: плохой файловый дескриптор" после вилки, dup2 и execv  ( C write error bad file descriptor after fork dup2 and execv ) 
Продолжение на Эта проблема , но я буду повторить: Для домашнего задания я должен написать базовую оболочку, включая перенаправление. Программа использует ...

4  Преобразование PDF в JPG с ImageMagick в PHP дает нечетный интервал письма  ( Converting a pdf to jpg with imagemagick in php gives odd letter spacing ) 
Я пытаюсь преобразовать PDF в JPG с PHP exec() Call, который выглядит так: <код> convert page.pdf -resize 716x716 page.jpg По какой-то причине JPG вых...

12  Могу ли я включить DLL в EXE (в Visual Studio)? [Дубликат]  ( Can i include dll in exe in visual studio ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> Этот вопрос уже есть ответы здесь : ...

0  Что означает результат Ant Exec: 128  ( Whats meaning of ant exec result128 ) 
Мой муравьи был остановлен при выполнении <код> "<exec excultable="c:myExe.exe"/>" , код результатов просто <код> "<message priority="error"><![CDATA[Result: ...

3  Предел символа запросов для сценариев PHP работает через командную строку?  ( Querystring character limit for php scripts run through command line ) 
(Backstory: мой скрипт PHP выполняет другой скрипт PHP через командную строку (команду PHP »(EXEC ()»), так что сеанс Curl, который создает целевой скрипт, не...

1  Выполнение нового процесса в C ++ и выполнение файла .jar  ( Forking a new process in c and executing a jar file ) 
Я пытаюсь написать программу, которая прочитает вывод из файла Java .jar, а также время от времени предоставляет ему ввод. В основном я надеюсь сделать програ...

0  C: DUP2 () перед Exece  ( C dup2 before execv ) 
Для домашнего задания я должен написать базовую оболочку, включая перенаправление. Программа использует readLine для приглашения ввода, анализирует входную ст...

0  Команда работает на SSH, но не работает при использовании функции PHP EXEC ()!  ( Command works on ssh but dont work when using php exec function ) 
Я пытаюсь запустить cutycapt на моем сервере centos, чтобы сделать скриншоты сайтов! Проблема в том, что команда <код> "/downloads/cutycapt/CutyCapt/CutyCap...

0  Дождитесь начала процесса с ProcessBuilder в Java  ( Wait for process start with processbuilder in java ) 
Я использую ProcessBuilder в Java, чтобы начать внешнее приложение JAR: <код> ProcessBuilder pb = new ProcessBuilder("java", "-jar", "app.jar"); Process p =...

3  Не могу запустить Laravel Engery с Exec (работает в командной строке, но не с ремесленником :: Call)  ( Cant run laravel envoy with exec works in command line but doesnt with artisa ) 
У меня есть сценарий посланника, который я запускаю в команде laravel. <Код> php artisan proxy:update <код> public function handle() { exec("envoy run...

11  Установите максимальное время выполнения для EXEC () специально [дубликат]  ( Set maximum execution time for exec specifically ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> Этот вопрос уже есть ответы здесь : ...

3  Как я могу назвать сценарий Shell из программы Java?  ( How can i call a shell script from a java program ) 
Я использую Ubuntu 10.04 с Eclipse. Я создал скрипт оболочки, экзамен .SH: <код> #!/bin/bash echo "Hello World" с chmod 755 экзамен .sh в командной с...

Связанный проблема

1  Бегущий пучок Exec в Eclipse 
0  Как создать UDF, который принимает строку запроса и возвращает результаты запроса 
43  Как порождать параллельные дочерние процессы на многопроцессорной системе? 
1  C: `Написать ошибку: плохой файловый дескриптор" после вилки, dup2 и execv 
4  Преобразование PDF в JPG с ImageMagick в PHP дает нечетный интервал письма 
12  Могу ли я включить DLL в EXE (в Visual Studio)? [Дубликат] 
0  Что означает результат Ant Exec: 128 
3  Предел символа запросов для сценариев PHP работает через командную строку? 
1  Выполнение нового процесса в C ++ и выполнение файла .jar 
0  C: DUP2 () перед Exece 
0  Команда работает на SSH, но не работает при использовании функции PHP EXEC ()! 
0  Дождитесь начала процесса с ProcessBuilder в Java 
3  Не могу запустить Laravel Engery с Exec (работает в командной строке, но не с ремесленником :: Call) 
11  Установите максимальное время выполнения для EXEC () специально [дубликат] 
3  Как я могу назвать сценарий Shell из программы Java?