2010-02-07 34 views
2

我有一些問題想弄清楚如何維護一個shell的管道和重定向功能,一旦我發現缺少命令行參數。檢查UNIX命令行參數,管道和C程序中的重定向

如果我例如使用scanf調用,它將與shell的重定向或管道一起工作,但是在沒有這個的情況下,我得到一個我不想要的提示。

我想通過argv [],一個管道或重新接受命令行參數,但我無法弄清楚如何做出來沒有得到提示。如果我例如嘗試這樣的事情:

if(argc < 2) 
    exit(0); 

然後程序會終止,如果我試試這個:

echo arg | myProgram 

或者這樣:

myProgram < fileWithArgument 

我也想看看這件事但我總是得到一些bash腳本參考。

+0

我還不清楚你想要完成什麼。如果你想出如何做到這一點,你的理想世界中的事情會如何運作? – Omnifarious 2010-02-07 09:28:58

+0

然後程序將允許這些類型的輸入: 程序,回聲 |程序,程序 Fred 2010-02-07 09:35:42

回答

7

處理這種情況的常見方法是檢查標準輸入流是否連接到終端,使用isatty或類似的功能取決於您的操作系統。如果是,則從命令行獲取參數,如果沒有(已重定向),則讀取標準輸入。

+0

偉大的,這似乎應該工作。我有isatty可用(os x)。謝謝 – Fred 2010-02-07 09:51:35

0

在你的例子使用的是管道重定向,既echo arg | myProgrammyProgram < filesWithArguments都將輸出發送到你的程序的STDIN

如果要讀取這些值,請在STDIN文件描述符上使用scanffread

如果您想獲得該文件的內容爲你的可執行文件的參數列表,你需要使用這樣的:

# This will pass `lala` as a variable 
myProgram `echo lala` 
+0

好吧,我明白了。但是我遇到的問題是,如果我根本沒有提供任何參數,我會得到一個提示。我想要的是使用說明,然後是終止。我沒有使用fread,但scanf或fgets。 – Fred 2010-02-07 09:55:26

2

短版:你不能做到這一點。

管道和重定向符不爭論你的程序,而他們給調用shell命令和程序,甚至存在正在運行的實例之前處理。 shell不會將它們傳遞給argv或任何其他變量中的程序,也無法以可靠的方式發現它們。

尼爾給了你the way to determine if you are connected to a terminal

+0

當然,我現在已經成功地使用了isatty。想要這樣做的原因是,這是大多數程序工作的方式。如果輸入無法被重定向,那麼在bash腳本中使用該程序是不可能的(或非常有限)。 – Fred 2010-02-08 01:22:12

+0

你會怎麼說這是通常在編寫命令行工具時完成的,如果它們要符合posix?他們應該接受管道和重定向。 – Fred 2010-02-08 01:37:25

+0

@Fred:我還不清楚*你想完成什麼。你不能做的是檢測什麼(如果有的話)流水線和重定向已經建立。通常情況下,您會編寫代碼以期望發生特定行爲,並提供命令行標誌以將其更改爲您支持的其他機制。那就是:你希望你的調用者*告訴你*他們發送什麼樣的非默認輸入。 – dmckee 2010-02-08 01:43:06