exec.n
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:16k
源码类别:

通讯编程

开发平台:

Visual C++

  1. '"
  2. '" Copyright (c) 1993 The Regents of the University of California.
  3. '" Copyright (c) 1994-1996 Sun Microsystems, Inc.
  4. '"
  5. '" See the file "license.terms" for information on usage and redistribution
  6. '" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  7. '" 
  8. '" RCS: @(#) $Id: exec.n,v 1.6.2.1 2004/10/27 09:35:38 dkf Exp $
  9. '" 
  10. .so man.macros
  11. .TH exec n 7.6 Tcl "Tcl Built-In Commands"
  12. .BS
  13. '" Note:  do not modify the .SH NAME line immediately below!
  14. .SH NAME
  15. exec - Invoke subprocesses
  16. .SH SYNOPSIS
  17. fBexec fR?fIswitchesfR? fIarg fR?fIarg ...fR?
  18. .BE
  19. .SH DESCRIPTION
  20. .PP
  21. This command treats its arguments as the specification
  22. of one or more subprocesses to execute.
  23. The arguments take the form of a standard shell pipeline
  24. where each fIargfR becomes one word of a command, and
  25. each distinct command becomes a subprocess.
  26. .PP
  27. If the initial arguments to fBexecfR start with fB-fR then
  28. they are treated as command-line switches and are not part
  29. of the pipeline specification.  The following switches are
  30. currently supported:
  31. .TP 13
  32. fB-keepnewlinefR
  33. Retains a trailing newline in the pipeline's output.
  34. Normally a trailing newline will be deleted.
  35. .TP 13
  36. fB-|-fR
  37. Marks the end of switches.  The argument following this one will
  38. be treated as the first fIargfR even if it starts with a fB-fR.
  39. .PP
  40. If an fIargfR (or pair of fIargfRs) has one of the forms
  41. described below then it is used by fBexecfR to control the
  42. flow of input and output among the subprocess(es).
  43. Such arguments will not be passed to the subprocess(es).  In forms
  44. such as ``< fIfileNamefR'' fIfileNamefR may either be in a
  45. separate argument from ``<'' or in the same argument with no
  46. intervening space (i.e. ``<fIfileNamefR'').
  47. .TP 15
  48. |
  49. Separates distinct commands in the pipeline.  The standard output
  50. of the preceding command will be piped into the standard input
  51. of the next command.
  52. .TP 15
  53. |&
  54. Separates distinct commands in the pipeline.  Both standard output
  55. and standard error of the preceding command will be piped into
  56. the standard input of the next command.
  57. This form of redirection overrides forms such as 2> and >&.
  58. .TP 15
  59. <fIfileNamefR
  60. The file named by fIfileNamefR is opened and used as the standard
  61. input for the first command in the pipeline.
  62. .TP 15
  63. <@fIfileIdfR
  64. fIFileIdfR must be the identifier for an open file, such as the return
  65. value from a previous call to fBopenfR.
  66. It is used as the standard input for the first command in the pipeline.
  67. fIFileIdfR must have been opened for reading.
  68. .TP 15
  69. <<fIvaluefR
  70. fIValuefR is passed to the first command as its standard input.
  71. .TP 15
  72. >fIfileNamefR
  73. Standard output from the last command is redirected to the file named
  74. fIfileNamefR, overwriting its previous contents.
  75. .TP 15
  76. 2>fIfileNamefR
  77. Standard error from all commands in the pipeline is redirected to the
  78. file named fIfileNamefR, overwriting its previous contents.
  79. .TP 15
  80. >&fIfileNamefR
  81. Both standard output from the last command and standard error from all
  82. commands are redirected to the file named fIfileNamefR, overwriting
  83. its previous contents.
  84. .TP 15
  85. >>fIfileNamefR
  86. Standard output from the last command is
  87. redirected to the file named fIfileNamefR, appending to it rather
  88. than overwriting it.
  89. .TP 15
  90. 2>>fIfileNamefR
  91. Standard error from all commands in the pipeline is
  92. redirected to the file named fIfileNamefR, appending to it rather
  93. than overwriting it.
  94. .TP 15
  95. >>&fIfileNamefR
  96. Both standard output from the last command and standard error from
  97. all commands are redirected to the file named fIfileNamefR,
  98. appending to it rather than overwriting it.
  99. .TP 15
  100. >@fIfileIdfR
  101. fIFileIdfR must be the identifier for an open file, such as the return
  102. value from a previous call to fBopenfR.
  103. Standard output from the last command is redirected to fIfileIdfR's
  104. file, which must have been opened for writing.
  105. .TP 15
  106. 2>@fIfileIdfR
  107. fIFileIdfR must be the identifier for an open file, such as the return
  108. value from a previous call to fBopenfR.
  109. Standard error from all commands in the pipeline is
  110. redirected to fIfileIdfR's file.
  111. The file must have been opened for writing.
  112. .TP 15
  113. >&@fIfileIdfR
  114. fIFileIdfR must be the identifier for an open file, such as the return
  115. value from a previous call to fBopenfR.
  116. Both standard output from the last command and standard error from
  117. all commands are redirected to fIfileIdfR's file.
  118. The file must have been opened for writing.
  119. .PP
  120. If standard output has not been redirected then the fBexecfR
  121. command returns the standard output from the last command
  122. in the pipeline.
  123. If any of the commands in the pipeline exit abnormally or
  124. are killed or suspended, then fBexecfR will return an error
  125. and the error message will include the pipeline's output followed by
  126. error messages describing the abnormal terminations; the
  127. fBerrorCodefR variable will contain additional information
  128. about the last abnormal termination encountered.
  129. If any of the commands writes to its standard error file and that
  130. standard error isn't redirected,
  131. then fBexecfR will return an error;  the error message
  132. will include the pipeline's standard output, followed by messages
  133. about abnormal terminations (if any), followed by the standard error
  134. output.
  135. .PP
  136. If the last character of the result or error message
  137. is a newline then that character is normally deleted
  138. from the result or error message.
  139. This is consistent with other Tcl return values, which don't
  140. normally end with newlines.
  141. However, if fB-keepnewlinefR is specified then the trailing
  142. newline is retained.
  143. .PP
  144. If standard input isn't redirected with ``<'' or ``<<''
  145. or ``<@'' then the standard input for the first command in the
  146. pipeline is taken from the application's current standard input.
  147. .PP
  148. If the last fIargfR is ``&'' then the pipeline will be
  149. executed in background.
  150. In this case the fBexecfR command will return a list whose
  151. elements are the process identifiers for all of the subprocesses
  152. in the pipeline.
  153. The standard output from the last command in the pipeline will
  154. go to the application's standard output if it hasn't been
  155. redirected, and error output from all of
  156. the commands in the pipeline will go to the application's
  157. standard error file unless redirected.
  158. .PP
  159. The first word in each command is taken as the command name;
  160. tilde-substitution is performed on it, and if the result contains
  161. no slashes then the directories
  162. in the PATH environment variable are searched for
  163. an executable by the given name.
  164. If the name contains a slash then it must refer to an executable
  165. reachable from the current directory.
  166. No ``glob'' expansion or other shell-like substitutions
  167. are performed on the arguments to commands.
  168. .VS
  169. .SH "PORTABILITY ISSUES"
  170. .TP
  171. fBWindowsfR (all versions)
  172. .
  173. Reading from or writing to a socket, using the ``fB@fIfileIdfR''
  174. notation, does not work.  When reading from a socket, a 16-bit DOS
  175. application will hang and a 32-bit application will return immediately with
  176. end-of-file.  When either type of application writes to a socket, the
  177. information is instead sent to the console, if one is present, or is
  178. discarded.
  179. .sp
  180. The Tk console text widget does not provide real standard IO capabilities.
  181. Under Tk, when redirecting from standard input, all applications will see an
  182. immediate end-of-file; information redirected to standard output or standard
  183. error will be discarded.  
  184. .sp
  185. Either forward or backward slashes are accepted as path separators for
  186. arguments to Tcl commands.  When executing an application, the path name
  187. specified for the application may also contain forward or backward slashes
  188. as path separators.  Bear in mind, however, that most Windows applications
  189. accept arguments with forward slashes only as option delimiters and
  190. backslashes only in paths.  Any arguments to an application that specify a
  191. path name with forward slashes will not automatically be converted to use
  192. the backslash character.  If an argument contains forward slashes as the
  193. path separator, it may or may not be recognized as a path name, depending on
  194. the program.  
  195. .sp
  196. Additionally, when calling a 16-bit DOS or Windows 3.X application, all path
  197. names must use the short, cryptic, path format (e.g., using ``applba~1.def''
  198. instead of ``applbakery.default''), which can be obtained with the
  199. fBfile attributes $fileName -shortnamefR command.
  200. .sp
  201. Two or more forward or backward slashes in a row in a path refer to a
  202. network path.  For example, a simple concatenation of the root directory
  203. fBc:/fR with a subdirectory fB/windows/systemfR will yield
  204. fBc://windows/systemfR (two slashes together), which refers to the mount
  205. point called fBsystemfR on the machine called fBwindowsfR (and the
  206. fBc:/fR is ignored), and is not equivalent to fBc:/windows/systemfR,
  207. which describes a directory on the current computer.  The fBfile joinfR
  208. command should be used to concatenate path components.
  209. .sp
  210. .RS
  211. Note that there are two general types of Win32 console applications:
  212. .RS
  213. 1) CLI -- CommandLine Interface, simple stdio exchange. fBnetstat.exefR for
  214. example.
  215. .br
  216. 2) TUI -- Textmode User Interface, any application that accesses the console
  217. API for doing such things as cursor movement, setting text color, detecting
  218. key presses and mouse movement, etc.  An example would be fBtelnet.exefR
  219. from Windows 2000.  These types of applications are not common in a windows
  220. environment, but do exist.
  221. .RE
  222. fBexecfR will not work well with TUI applications when a console is not
  223. present, as is done when launching applications under wish.  It is desirable
  224. to have console applications hidden and detached.  This is a designed-in
  225. limitation as fBexecfR wants to communicate over pipes.  The Expect
  226. extension addresses this issue when communicating with a TUI application.
  227. .sp
  228. .RE
  229. .TP
  230. fBWindows NTfR
  231. .
  232. When attempting to execute an application, fBexecfR first searches for
  233. the name as it was specified.  Then, in order, fB.comfR, fB.exefR, and
  234. fB.batfR are appended to the end of the specified name and it searches
  235. for the longer name.  If a directory name was not specified as part of the
  236. application name, the following directories are automatically searched in
  237. order when attempting to locate the application:
  238. .sp
  239. .RS
  240. .RS
  241. The directory from which the Tcl executable was loaded.
  242. .br
  243. The current directory.
  244. .br
  245. The Windows NT 32-bit system directory.
  246. .br
  247. The Windows NT 16-bit system directory.
  248. .br
  249. The Windows NT home directory.
  250. .br
  251. The directories listed in the path.
  252. .RE
  253. .sp
  254. In order to execute shell built-in commands like fBdirfR and fBcopyfR,
  255. the caller must prepend the desired command with ``fBcmd.exe /cfR''
  256. because built-in commands are not implemented using executables.
  257. .sp
  258. .RE
  259. .TP
  260. fBWindows 9xfR
  261. .
  262. When attempting to execute an application, fBexecfR first searches for
  263. the name as it was specified.  Then, in order, fB.comfR, fB.exefR, and
  264. fB.batfR are appended to the end of the specified name and it searches
  265. for the longer name.  If a directory name was not specified as part of the
  266. application name, the following directories are automatically searched in
  267. order when attempting to locate the application:
  268. .sp
  269. .RS
  270. .RS
  271. The directory from which the Tcl executable was loaded.
  272. .br
  273. The current directory.
  274. .br
  275. The Windows 9x system directory.
  276. .br
  277. The Windows 9x home directory.
  278. .br
  279. The directories listed in the path.
  280. .RE
  281. .sp
  282. In order to execute shell built-in commands like fBdirfR and fBcopyfR,
  283. the caller must prepend the desired command with ``fBcommand.com /cfR''
  284. because built-in commands are not implemented using executables.
  285. .sp
  286. Once a 16-bit DOS application has read standard input from a console and 
  287. then quit, all subsequently run 16-bit DOS applications will see the 
  288. standard input as already closed.  32-bit applications do not have this
  289. problem and will run correctly, even after a 16-bit DOS application thinks 
  290. that standard input is closed.  There is no known workaround for this bug
  291. at this time.
  292. .sp
  293. Redirection between the fBNUL:fR device and a 16-bit application does not
  294. always work.  When redirecting from fBNUL:fR, some applications may hang,
  295. others will get an infinite stream of ``0x01'' bytes, and some will actually
  296. correctly get an immediate end-of-file; the behavior seems to depend upon 
  297. something compiled into the application itself.  When redirecting greater than
  298. 4K or so to fBNUL:fR, some applications will hang.  The above problems do not
  299. happen with 32-bit applications.  
  300. .sp
  301. All DOS 16-bit applications are run synchronously.  All standard input from
  302. a pipe to a 16-bit DOS application is collected into a temporary file; the
  303. other end of the pipe must be closed before the 16-bit DOS application
  304. begins executing.  All standard output or error from a 16-bit DOS
  305. application to a pipe is collected into temporary files; the application
  306. must terminate before the temporary files are redirected to the next stage
  307. of the pipeline.  This is due to a workaround for a Windows 95 bug in the
  308. implementation of pipes, and is how the standard Windows 95 DOS shell
  309. handles pipes itself.
  310. .sp
  311. Certain applications, such as fBcommand.comfR, should not be executed
  312. interactively.  Applications which directly access the console window,
  313. rather than reading from their standard input and writing to their standard
  314. output may fail, hang Tcl, or even hang the system if their own private
  315. console window is not available to them.
  316. .RE
  317. .TP
  318. fBMacintoshfR
  319. The fBexecfR command is not implemented and does not exist under Macintosh.
  320. .TP
  321. fBUnixfR
  322. The fBexecfR command is fully functional and works as described.
  323. .SH "UNIX EXAMPLES"
  324. Here are some examples of the use of the fBexecfR command on Unix.
  325. .PP
  326. To execute a simple program and get its result:
  327. .CS
  328. fBexecfR uname -a
  329. .CE
  330. .PP
  331. To execute a program that can return a non-zero result, you should
  332. wrap the call to fBexecfR in fBcatchfR and check what the contents
  333. of the global fBerrorCodefR variable is if you have an error:
  334. .CS
  335. set status 0
  336. if {[catch {fBexecfR grep foo bar.txt} results]} {
  337.    if {[lindex $::errorCode 0] eq "CHILDSTATUS"} {
  338.       set status [lindex $::errorCode 2]
  339.    } else {
  340.       # Some kind of unexpected failure
  341.    }
  342. }
  343. .CE
  344. .PP
  345. When translating a command from a Unix shell invocation, care should
  346. be taken over the fact that single quote characters have no special
  347. significance to Tcl.  Thus:
  348. .CS
  349. awk '{sum += $1} END {print sum}' numbers.list
  350. .CE
  351. would be translated into something like:
  352. .CS
  353. fBexecfR awk {{sum += $1} END {print sum}} numbers.list
  354. .CE
  355. .PP
  356. If you are converting invocations involving shell globbing, you should
  357. remember that Tcl does not handle globbing or expand things into
  358. multiple arguments by default.  Instead you should write things like
  359. this:
  360. .CS
  361. eval [list fBexecfR ls -l] [glob *.tcl]
  362. .CE
  363. .PP
  364. .SH "WINDOWS EXAMPLES"
  365. Here are some examples of the use of the fBexecfR command on Windows.
  366. .PP
  367. To start an instance of fInotepadfR editing a file without waiting
  368. for the user to finish editing the file:
  369. .CS
  370. fBexecfR notepad myfile.txt &
  371. .CE
  372. .PP
  373. To print a text file using fInotepadfR:
  374. .CS
  375. fBexecfR notepad /p myfile.txt
  376. .CE
  377. .PP
  378. If a program calls other programs, such as is common with compilers,
  379. then you may need to resort to batch files to hide the console windows
  380. that sometimes pop up:
  381. .CS
  382. fBexecfR cmp.bat somefile.c -o somefile
  383. .CE
  384. With the file fIcmp.batfR looking something like:
  385. .CS
  386. @gcc %1 %2 %3 %4 %5 %6 %7 %8 %9
  387. .CE
  388. .PP
  389. Sometimes you need to be careful, as different programs may have the
  390. same name and be in the path. It can then happen that typing a command
  391. at the DOS prompt finds fIa different programfR than the same
  392. command run via fBexecfR. This is because of the (documented)
  393. differences in behaviour between fBexecfR and DOS batch files.
  394. .PP
  395. When in doubt, use the command fBauto_execokfR: it will return the
  396. complete path to the program as seen by the fBexecfR command.  This
  397. applies especially when you want to run "internal" commands like
  398. fIdirfR from a Tcl script (if you just want to list filenames, use
  399. the fBglobfR command.)  To do that, use this:
  400. .CS
  401. eval [list fBexecfR] [auto_execok dir] [list *.tcl]
  402. .CE
  403. .SH "SEE ALSO"
  404. error(n), open(n)
  405. .SH KEYWORDS
  406. execute, pipeline, redirection, subprocess