【问题标题】:Access to bash local variable in c访问c中的bash局部变量
【发布时间】:2019-10-04 02:51:04
【问题描述】:

我正在尝试用 C 重新制作一个 ls 命令;如果列出了目录内容(正如 Unix ls 所做的那样),我需要复制一个“总”行。 我知道这是文件大小的总和(不考虑软链接和内部目录内容),四舍五入,除以局部变量 BLOCKSIZE,如果错了,请纠正我。 问题是:BLOCKSIZE 到底是什么,我如何从终端检查它以及如何在 c 中获取它的值。 PS:我的 c 程序必须从 ./program [options] {files} 之类的 bash 运行,我不能在 main 中将任何其他内容传递给 argv。 提前致谢!

【问题讨论】:

  • 您可以将其作为命令行参数传递给您的程序,也可以将其作为环境变量导出到您的程序。
  • 非常感谢您的建议,所以要导出它类似于 export VAR ,对吧?
  • 对,这取决于您使用的 shell,但对于 sh 和 bash,您将使用 export。然后你可以在你的 C 程序中使用getenv

标签: c bash ls


【解决方案1】:

来自GNU coreutils

通过依次检查以下环境变量来选择默认块大小;设置的第一个决定块大小。
....
块大小

BLOCKSIZE 是一个环境变量。您可以使用 C 标准 getenv() 调用来获取环境变量的值。

 const char *blocksizestr = getenv("BLOCKSIZE");
 if (blocksizestr == NULL) { /* no BLOCKSIZE variable */ }
 int blocksize = atoi(blocksizestr);

还要注意BLOCKSIZE 不会直接影响lscoreutils/ls.c 没有引用它。 LS_BLOCK_SIZEBLOCK_SIZE 是。 BLOCKSIZE 环境变量在human_options()human_readable() 函数中的gnulib/human.c 库中使用。 human_readable() 被 gnu 实用程序用来打印人类可读的输出。

【讨论】:

    【解决方案2】:

    查找 POSIX statvfs()<sys/statvfs.h>。如图所示描述的成员听起来像您需要的信息:

    • unsigned long f_bsize — 文件系统块大小

    这样,您无需依赖用户获取信息;你可以让系统告诉你的程序你需要知道什么。

    【讨论】:

      【解决方案3】:

      --block-sizecommand line argumentls

      man ls(1):

      --block-size=SIZE
      使用-l,在打印时按SIZE 缩放尺寸;例如。, --block-size=M;请参阅下面的 SIZE 格式

      【讨论】:

      • 也许我忘记了一个重要信息(我会在问题中更正它),我的 c 程序必须从终端运行一些选项和文件(类似于 ./program.c -l -R file1 dir1 file2 ecc.) 但仅此而已。所以我需要通过系统调用或类似的东西从 c 中获取它。无论如何感谢您的快速回答。
      猜你喜欢
      • 2014-09-23
      • 2020-06-29
      • 2017-10-17
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      • 2014-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多