7

プログラムの列数と行数を取得しようとしています。そのために次のコードを使用しています。

...

char *cols = getenv("COLUMNS");
printf("cols: %s\n", cols);

char *lines = getenv("LINES");
printf("lines: %s\n", lines);

...

問題は、これを実行すると両方で null になることです。PATHまたはなどの他の環境変数でこれを実行するとUSER、正常に動作します。

私が奇妙だと思うのは、実行echo $COLUMNSecho $LINES同じシェルからの両方が正常に機能することです。

私のプログラムがこれら 2 つの環境変数を取得できないのはなぜですか。

4

3 に答える 3

5

COLUMNSLINESはシェルによって設定されますが、エクスポートされません。つまり、後で実行されるコマンドの環境に追加されません。(それを確認するには、 の出力を調べます。 と は表示されますが、と/usr/bin/envは表示さPATHUSERません。)COLUMNSLINES

bash シェルでは、 を呼び出しexport VARて、エクスポート用の変数をマークできます。

または、「 C で端末の幅を取得しますか?」を参照してください。 端末の幅と高さをプログラムで取得するさまざまな方法。

于 2014-03-23T08:32:08.407 に答える
1

$LINESとが表示されない場合$COLUMNSは、おそらく設定されていません。xterm のマニュアル ページには、システム構成に応じて設定される可能性があると記載されています。

プログラムに渡される環境変数を確認したい場合は、この小さなプログラムを使用してください (これは、main()すべての IXish システムで使用できる3 番目の非標準の「隠し」パラメーターを使用します。

#include <stdio.h>

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

端末ウィンドウのサイズを取得するポータブルな方法が必要な場合は、おそらく使用するのが最善ですioctl(..., TIOCGWINSZ, ...)

于 2014-03-23T08:14:10.583 に答える
0

実際には、COLUMNSLINESはシェル変数ですが、環境変数ではありません。

を使用envして、現在のシェルの環境変数のリストをset表示したり、シェル変数のリストを表示したりできます。また、環境変数はシェル変数のサブセットであることがわかります。

この質問への回答は役に立ちます:
bash のシェルと環境変数の違い

于 2014-03-23T08:40:03.337 に答える