2014-09-23 166 views
0

我有一個運行的線沿線的東西bash腳本:重定向輸出bash腳本

python myscript.py --input=/path/file --someOption=value > /path/file 

如果我跑它沒有重定向,一切工作正常。如果我用重定向運行它,文件會被截斷。我懷疑Python正在執行整個行,包括重定向,而實際上重定向必須由bash執行。

我想:

exec "python myscript.py --input=/path/file --someOption=value",但我得到命令沒有找到錯誤。

如何讓python執行python部分,並通過bash執行重定向?

+0

python沒有做重定向,shell是,而且它是在運行命令之前做的。我不知道你期待的是'exec'試圖完成的事情。 – 2014-09-23 16:33:14

回答

6

您無法同時讀取和寫入同一個文件。

輸出重定向到一個臨時位置,然後覆蓋輸入:

if python myscript.py --input=/path/file --someOption=value > /path/file.tmp 
then 
    mv /path/file.tmp /path/file 
fi 
+0

我以爲Python會讀取文件,處理它,將結果打印到標準輸出,然後終止輸出將被重定向的點。 – ventsyv 2014-09-23 16:52:26

+2

@ventsyv,重定向發生*之前*命令啓動;在這種情況下,它將FD 1寫入已經截斷的'/ path/file' inode的命令。由於它已經被截斷,所以顯然不能從那裏讀取輸入。 – 2014-09-23 17:02:27

1

的問題是你使用相同的文件作爲輸入和輸出。 Shell首先打開重定向的文件,它變成空的。然後你的python腳本讀空文件。

它可以很容易地解決使用tee

python myscript.py --input=/path/file --someOption=value | tee /path/otherfile 
+1

'tee'在這裏沒有必要;你只是使用了一個不同的輸出文件,它也適用於簡單的重定向。 – chepner 2014-09-23 17:45:26

+0

這是我的舊回答。正如有人已經介紹過它,我提到了'tee' – 2014-09-23 19:23:16