2011-09-09 35 views
1

我有一個包含bash命令的文件,我逐一讀取它們並調用eval來運行它們。這工作正常,直到我嘗試運行「emacs-nw」。我已將問題簡化爲以下情況。任何人都可以解釋爲什麼emacs命令不工作,以及如何解決它?我懷疑它有一些引號和/或連字符,但無法找出問題,並且其中有空格的其他命令可以正常工作。通過從文件中讀取命令啓動emacs -nw遇到問題

考慮以下情況:

>> cmd="emacs -nw"; echo $cmd; eval $cmd; 

可正常工作。 Emacs在當前shell中打開。

>> cmd="ls /tmp"; echo $cmd; eval $cmd; 

這按預期工作。我看到/ tmp的內容。

>> echo "emacs -nw" > /tmp/cmds; cat /tmp/cmds | 
    while read cmd; do echo $cmd; eval $cmd; done 

這是行不通的。我得到了「emacs:標準輸入不是tty」,就好像我正在嘗試將輸入管道輸入到emacs -nw(例如grep並將其輸入到較少的方式)。

>> echo "ls /tmp" > /tmp/cmds; cat /tmp/cmds | 
    while read cmd; do echo $cmd; eval $cmd; done 

這個按預期工作,所以我不認爲引用/空格有問題。這留下了連字符,但如果我這樣做,說,「ls -alh」,那也可以。

那麼emacs命令怎麼了?

謝謝。

回答

3

當你輸入任何命令時,你正在替換它的標準輸入。你管道進入while ... doneemacs是該命令的一部分,因此其標準輸入是管道。

我想,會有一些聰明的使用重定向,通過它可以'保存'和'恢復'標準輸入,但我還沒有拿出它。或者,你可以eval $cmd </dev/tty

+0

eval $ cmd Jer

+0

另外值得注意的是'ls'不必使用stdin,所以不會顯示問題。 –

1

Emacs需要一個tty運行在-nw模式下你的貓|而讀循環使用cat的輸出作爲所有子命令的標準輸入,這不是一個tty。最好的做法是將所有/ tmp/cmd行加載到一行數組中,然後循環遍歷數組以運行每個命令(但這對於引用問題也可能會變得棘手)。

相關問題