2013-09-30 44 views
1

我有一個shell命令,它提供了我想在將其管道輸入到另一個命令之前編輯的輸出。這不是常規的輸出,可以用sed等很容易編輯。我目前的做法是:

command-one > tmp 
vim tmp 
command-two < tmp 
rm tmp 

我想避免臨時文件的創建不必要的,而是像做command-one | vim - | command-two但由於VIM的實際屏幕的輸出被管道輸送到命令,而不是不工作對我來說是可見的編輯。這在類似git commit的命令中起作用,在使用結果之前等待臨時文件被寫入。

+0

'pipes'創建tmp文件,只需在管道完成時不必刪除它們即可。用第一個塊中列出的命令製作一個腳本,你就會很好。祝你好運! – shellter

+0

這只是一個例子。我不會每次都做同樣的腳本操作。我發現自己經常需要這種模式,所以它不是我可以放在腳本中並且完成的東西。 –

+0

如果您爲使用的shell包含標籤(bash | ksh | csh | ...),您將獲得更多受訪者。得到你想要的東西可能有一些竅門,但如果它存在,我會感到驚奇,2它不脆弱。祝你好運!。 – shellter

回答

1

如果你想使用一些隨機編輯器(即值爲$EDITOR),你需要使用一個臨時文件。編輯完成後,大多數編輯無法接受stdin上的整個文件並將其寫入stdout

請參閱mktemp(或tempfile在不太可能的情況下,您沒有mktemp)安全地創建臨時文件。

0

試試這個:

tmpfile=$(mktemp); command-one > $tmpfile && vim $tmpfile && command-two < $tmpfile && rm $tmpfile 
2

這是困難的,因爲陳述,因爲正如你已經指出,要適應一個管道一樣,編輯需要顯示一兩件事給用戶,並輸出不同的東西在標準輸出。

但是,如果管道不休息太長/太可怕了,這裏的東西,你可以使用vim做:

$ vim <(first | part | of | pipeline) 

這通過vim的一個參數,它是一個命名管道輸出者的標準輸出命令。有效的結果是你得到一個包含那個輸出的緩衝區。編輯它,然後,在退出之前:

:w !rest | of | pipeline 
,其運行在一個殼 rest | of | pipeline並供給電流緩衝器到其標準輸入

。你會在vim中看到該命令的輸出,然後你將能夠:q!放棄修改後的緩衝區並返回到你的shell。