2016-12-01 14 views
1

我目前正在研究我自己的歷史內建副本。 我知道我需要HISTSIZE,HISTFILE和HISTFILESIZE變量來實現命令選項,但我不知道如何獲取它們。有沒有類似於getenv的函數或像environ這樣的變量,但是使用本地shell變量?如何獲得C中的本地shell變量?

在此先感謝!

+0

在你的主要聲明中,你可以使用'char ** envp',所以它看起來像:'int main(int argc,char ** argv,char ** envp)'。希望它有幫助 –

+0

['std :: getenv'](http://en.cppreference.com/w/cpp/utility/program/getenv) – Danh

+0

我沒有得到HIST變量envp – Bob

回答

1

井一個內置直接由外殼2個的可能原因執行:

  • 你避免產生一個新的processus (性能原因)
  • 它是能夠訪問內部shell變量(你的使用情況)的唯一途徑

一個shell只能通過兩種方式提供進入其內部變量:

  • 要麼將它們複製到環境中,因爲的定義環境是傳遞給子進程的變量列表
  • 要麼提供了進程間通信機制(命名管道,私有套接字等等)),以允許其孩子的問他們

據我所知,沒有通用的shell執行下去,但可以將需要的shell變量導出到環境:

export HIST 
export HISTSIZE 
export HISTFILESIZE 

應該足以後來讓他們通過getenv

0

主聲明可以有一個額外的參數char **envp,它是一個由NULL指針終止的二維數組。這裏有一個例子:

#include <stdio.h> 

int main(int argc, char **argv, char **envp) 
{ 
    int index = 0; 
    while (envp[index]) 
     printf("%s\n", envp[index++]; 
    return 0; 
} 


編輯


使用envp將爲您提供獲得環境在。要找到shell變量,我找到了this。我認爲這可以幫助你。

+0

envp只給我的環境變量,我需要HISTSIZE,HISTFILE和HISTFILESIZE這是shell變量。你可以看到那些在命令中使用命令「set」 – Bob

+0

'envp'作爲第三個參數[不可移植](http://stackoverflow.com/questions/10321435/is-char-envp-as-a-third -argument到主便攜式)。 – nwellnhof

0
#include <stdio.h> 
#include <stdlib.h> 

int main() { 

printf("SET = %s\n",getenv("SET")); 

return 0; 

} 

爲了測試程序,設置變量,然後再執行: -

出口SET = 1

0

由於STEFFAN Hegny指出的那樣,沒有辦法,如果他們沒有進入電影這些變量環境變量。所以popen(),我認爲可以幫助,不是解決您的問題。

但是,如果您需要訪問這些變量,則可以將它們的值導出到可通過getenv(char*)訪問的實際環境變量。

E.g.

export _HISTFILE=$HISTFILE && ./myProgram 

_HISTFILE=$HISTFILE ./myProgram 

myProgram訪問這樣的值:

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    printf("History file: %s", getenv("_HISTFILE")); 
}