2010-10-06 55 views
0

如何設置要使用的字符串而不是標準輸入?例如,在Unix中運行latex命令時,它總會發現一些微不足道的錯誤,要跳過所有必須在命令行中輸入「r」的錯誤(我現在知道使用latex特別是可以使用-interactionmode nonstopmode,但有沒有更通用的解決方案來做到這一點?) 是否有指定這應該自動完成?我嘗試重定向標準輸入以從包含「r \ n」的文件中讀取,但這不起作用。 我該如何做到這一點?如何執行自動化的Unix輸入?

+1

屬於superuser.com。 – Philipp 2010-10-06 15:54:24

+1

超級用戶的邊緣。它可能會在[Tex LaTex和Friends](http://tex.stackexchange.com)上得到更快的答案,但這是一個shell腳本問題,所以暫時可以接受。 – dmckee 2010-10-06 16:05:43

+1

我應該說「邊緣爲*移動*超級用戶」。首先它會在那裏發佈。 – dmckee 2010-10-06 16:23:59

回答

4

不是需要輸入可以是滿意自己的標準輸入重定向的所有應用程序。

這是因爲應用程序可以調用isatty C函數(如果使用C語言編寫,或者使用其他語言的某些等效調用)來確定輸入是否來自tty。

在這種情況下,有一個有價值的工具可以使用,這是expect

0

man page

-interaction模式

設置交互模式。該模式可以是批模式,非停模式,滾動模式和errorstopmode。這些模式的含義與相應\命令的含義相同。

看起來像-interaction nonstopmode可能會幫助你。

+0

這確實回答了我如何專門爲乳膠做的問題,但不完全是關於如何實現輸入自動化的其他部分 – Tom 2010-10-06 15:48:38

+0

一般而言,您所做的(重定向標準輸入)應該可以工作,但如果程序直接讀取,它會失敗從控制檯而不是標準輸入,在這種情況下,沒有簡單的解決方案。但我懷疑乳膠屬於這一類 - 也許你忽視了一些簡單的東西。 – casablanca 2010-10-06 15:52:52

2
latex --interaction=MODE 

其中MODE是一個:

  • errorstopmode:停止在每一個錯誤,並要求輸入
  • scrollmode:滾動了非致命錯誤,但在致命錯誤停止(如「文件未找到「)
  • nonstopmode:滾動到非致命錯誤,在致命錯誤處終止
  • batchmode:與一樣,但不會在終端

對於交互式用戶顯示messaes,errorstopmode(默認值)是好的,對於非交互使用,nonstopmodebatchmode更好。

但要小心,沒有小錯誤:所有的錯誤必須是固定的,如果可能的話,所有的警告應該是固定的。

將stdin重定向工作沒有問題在這裏:

/tmp $ tex '\undefined\end' <<< r 
This is TeX, Version 3.1415926 (TeX Live 2010) 
! Undefined control sequence. 
<*> \undefined 
       \end 
? OK, entering \nonstopmode... 
(see the transcript file for additional information) 
No pages of output. 
Transcript written on texput.log. 
2

你有兩個可能的答案,詳細說明乳膠的具體處理方法。一個評論表明你需要更一般的答案。

通常,推薦用於一般解決方案的工具是'expect'。它安排命令有一個僞tty連接到輸入和輸出,並且命令與僞tty交互,就像它真正的終端一樣。你告訴'期望'發送某些字符串,並期望某些其他字符串,使用條件代碼和正則表達式來幫助你這樣做。

期望使用Tcl/Tk構建。有其他語言的替代實現;例如,Perl有一個Expect模塊。