2017-07-24 76 views
1

我正在開發一個小型的JS項目並試圖獲得一個腳本來運行,它編譯了一些以我們自己的「語言x」編寫的源文件。在兩個不同的目錄之間運行「<」命令

要運行編譯器通常你會使用命令./a.out < source.x它會打印出成功或編譯錯誤等

在現在的情況下,我想兩個目錄之間的工作,並使用這個命令:

sudo ~/Documents/server/xCompiler/./a.out < ~/Documents/server/xPrograms/source.x

但這不產生輸出到終端的所有,並且不影響輸出文件。使用<有什麼問題嗎?我打算稍後在節點服務器中使用它,請參閱child_process.exec

任何幫助將不勝感激,我有點難住。 謝謝。

+2

你不會告訴'a.out'在做什麼,也不會說你正在使用哪個shell。回答這個問題是不可能的。這就像你問我「根據祖母的祕方,我今天做了一頓飯,但是它的烹飪方式和我吃的不一樣,我做錯了什麼?」 – user1934428

+0

'sudo'?你爲什麼要以root身份運行你的編譯器?這意味着它不會與您在自己帳戶下運行的命令一樣被調用相同的環境變量。 –

+0

順便說一句,有兩個可能的問題原因,它們都不需要將完全合格的路徑傳遞給''''重定向操作符。 (1)是編譯器希望找到相對於當前工作目錄的支持文件,但cwd不再是編譯器本身所在的目錄。 (2)是'sudo'在一個不存在環境變量的環境中運行你的編譯器。 –

回答

2

重定向操作符(<>,以及其他類似的)描述要由外殼你的命令運行在所有之前執行操作。因爲這些操作是由shell自己執行的,所以它們不太可能以特定於單個命令的方式被破壞:當它們執行時,該命令還沒有開始。

有,但是,一些更有針對性的方式您的第一和第二命令不同:

  • 第二(非工作)一個使用完全合格的路徑編譯器本身。這意味着編譯器所在的目錄和編譯器運行的當前工作目錄可能有所不同。如果編譯器在相對於其當前工作目錄的位置或位置查找文件,則可能會導致失敗。
  • 第二個使用sudo來提升權限以運行編譯器。這意味着你作爲一個不同的用戶運行,其中大部分環境變量被清除或修改(除非在交換機中明確列入白名單) - 並且具有廣泛的潛在可能性,這取決於編譯器對其運行時環境的期望的細節我們可以合理預期在這裏診斷。

第一個問題至少可以解決問題。在外殼:

xCompile() { 
    (cd ~/Documents/server/xCompiler && exec ./a.out "[email protected]") 
} 

xCompile < ~/Documents/server/xPrograms/source.x 

使用exec是一個性能優化:它平衡創建通過消耗子shell啓動編譯器,而不是啓動它作爲一個子一個子shell新(用括號)的成本。

調用節點child_process.exec(),您可以簡單地在cwd參數中傳遞所需的運行時目錄,因此不需要shell函數。

+0

哦,謝謝!我認爲這其實是兩個問題。編譯器在cwd中查找文件,我沒有意識到sudo以這種方式工作。這使現在更有意義,我非常感謝幫助。 – Bort

+0

'sudo'必須爲了安全原因清除環境變量 - 否則,類似於'LD_PRELOAD'或導出的shell變量可能會改變升級後代碼的行爲,使得在/ etc/sudoers中列入白名單的命令成爲安全突然不那麼如此。 –

相關問題