2011-03-23 68 views
2

我有一個C程序打印每個環境變量,其名稱由標準輸入。 它打印變量,如$ PATH,$ USER但它看不到我在Linux shell中定義自己的環境變量...例如,在bash中,我定義了my = 4,並且我期望程序返回4當我提供輸入「我的」。使用getenv函數

int main () { 
    char * key = (char *)malloc(30); 

    scanf("%s", key); 

    if(getenv(key) != NULL) 
    printf("%s\n", getenv(key)); 
    else 
    printf("NULL\n"); 

    return 0; 
} 

我該怎麼做才能改善getenv的結果? 我希望它向我展示所有環境變量以及來自Linux shell的所有繼承。 謝謝..

+2

不需要'malloc'固定長度塊。只要'char key [30]'就可以。 (你從來沒有'免費'的塊,順便說一句) – 2011-03-23 08:12:27

+0

@larsmans:謝謝你的觀察,這只是一個匆忙的例子,我需要在更廣泛的背景下getenv :) – shaku 2011-03-25 15:41:30

回答

5

有幾個途徑:通過不同的機制

  1. my=4; export my; ./program
  2. my=4 ./program
  3. env my=4 ./program

每一種方法都有同樣的效果,但。

  1. 這種方法是特定於您正在使用的外殼,但它是這樣工作在最典型的殼(Bourne shell的變種; CSH衍生彈再次是不同的)。首先設置一個shell變量,然後將其導出到環境變量,然後運行您的程序。在某些炮彈上,可以將其縮寫爲export my=4。程序運行後變量保持設置狀態。

  2. 該方法也依賴於你的shell。這爲./program的執行設置了my環境變量臨時。運行後,my不存在(或具有其原始值)。

  3. 這使用env程序在運行程序之前設置環境變量。這種方法是而不是依賴於任何特定的外殼,並且是最便攜的。像方法2一樣,這會臨時設置環境變量。事實上,外殼從來不知道my已經設置。

+1

+1:1,我建議更換「最典型殼「與」Bourne shell變體「(或」所有可用的殼「:)) – 2011-03-23 10:11:01

2

如果你沒有export那麼它只是一個shell變量,而不是一個環境變量。使用export my=4my=4; export my

1

這與C或getenv無關。如果在shell中執行my=4,則已定義一個本地shell變量。要製作一個環境變量,請執行export my