2016-08-17 59 views
2
function run() { 
    nohup python $1 > nohup.out & 
} 

在命令行中我把這個稱爲「跑scriptname.py」和bash執行以下命令:如何將此bash函數轉換爲魚殼?

python scriptname.py > nohup.out & 

你能不能幫我翻譯這魚。

我有這個迄今爲止..

function run 
    bash -c "nohup python $1 > nohup.out &" 
end 

當我打電話源〜/的.config /魚/ config.fish

它存在只是說

沒有提供任何有關錯誤的有用提示。

+0

你想讓它翻譯成所有的錯誤完好無損嗎? –

+0

...爲什麼要使用'paste'?它在這裏購買絕對沒有價值。如果你想把(stdin)翻譯成參數列表,'$(cat)'會等價地做到這一點。 –

+0

...但再次看到,*糟糕*。它不會處理引號,它不會讓你逃避,它不會讓你用空格傳遞參數......如果你描述了你的實際目標並要求最好的方法來實現它,那會更好,比給我們一個錯誤的代碼翻譯。 –

回答

3

這是魚的功能完全有效的(更正確)更換:

function run 
    bash -c 'nohup python "[email protected]" > nohup.out &' _ $argv 
end 

這是一個相當於原生-bash函數:

run() { 
    nohup python "[email protected]" </dev/null >nohup.out 2>&1 & 
} 

...這,我個人建議重寫使用disown而不是nohup


對於從fish看到的錯誤,我建議關注任何其他(沒有語法有關的),這可能會影響到您的文件是否可以讀取 - 權限等

3

這裏確實沒有必要執行bash,魚也可以執行nohup,重定向也起作用等等。

這裏有一個小小的區別,而不是$ 1和$ 2等等,fish函數的參數存儲在$ argv數組中。

function run 
    nohup python $argv > nohup.out & 
end 

這將擴大$ argv已到的所有元素作爲每一個元素,所以run script.py banana將運行nohup python script.py banana > nohup.out &。如果您確實只需要傳遞一個參數,則需要$argv[1]

我實際上不知道爲什麼你的定義應該在採購config.fish時導致錯誤 - 你正在使用哪種魚版本?

+0

請注意,在我的系統中,'nohup'會打印一條關於stderr被重定向到stdout _on stderr_的煩人消息,但是在bash下執行同樣的操作也會發生。 – faho