【问题标题】:Shell Script with environment variable带有环境变量的 Shell 脚本
【发布时间】:2013-09-16 00:41:41
【问题描述】:

我有一个 C 程序,最后有以下代码:

    memcpy(buff,"TEST=",4)
    putenv(buff)
    system("/bin/bash")

我将一个新的环境变量放入一个新的 shell 中。然后我想将测试回显到我可以轻松完成的文本文件中。然后我想退出 shell 并再次运行它,所以运行它看起来如下

   ./cprog "some arg"
   echo $TEST > test.txt
   exit
   ./cprog "some arg"
   echo $TEST > test.txt
   exit

我必须继续退出,这样我才能更改 TEST 变量。如何在 shell 脚本中完成这项工作,这样我就可以继续循环并运行 c 程序,这样我就可以更改参数但永远不会退出 shell 脚本本身。

【问题讨论】:

  • 第一个memcpy 应该做什么?就目前而言,它将 4 个字符 TEST 复制到 buff。
  • 您的问题不清楚。为什么要从程序内部启动一个额外的外壳?您谈论更改 TEST 变量,但不说您如何更改它。您的 memcpy 长度错误,并且您从未为 TEST 分配值。
  • buff 里面已经有东西了,我在前面加了应该是 5 对不起
  • 程序不能改变控制shell的环境。
  • 如果我不启动额外的 shell,当我回显它时该变量为空。

标签: c bash shell environment-variables


【解决方案1】:

您的程序不可能更改父进程的环境,这似乎是您正在尝试做的事情。

但是,您可以做的是让您的程序简单地打印所需的输出,然后使用eval 调用它。

$ ./cprog "wibble"
TEST=wibble
$ eval `./cprog "wibble"`
$ echo ""TEST\" is now equal to \"$TEST\""
"TEST" is now equal to "wibble"
$

【讨论】:

  • 显然,这假设您信任cprog 的输出(例如,它不受用户输入的影响),否则有人可能会操纵它写成TEST=foo rm -rf /,而eval 会很乐意执行。跨度>
  • 整个问题的前提是信任cprog,所以我看不出问题所在。请注意,cprog 是提问者自己的程序,来自问题。
  • 您必须相信cprog 会适当地转义它从它为您当前运行的shell 处理的任何数据中读取的任何值。此安全问题是在您建议的更改中引入的,以前不存在。
【解决方案2】:

环境变量不是将信息从进程传递给用户或调用进程的适当方式。您应该将此信息写入标准输出(以及任何其他信息到标准错误)并适当地重定向它。

如果你坚持这个解决方案,你可以使用

for p in "one arg" "another arg" "more"
do 
    echo 'printf "%s\n" "$TEST" >> test.txt' | ./cprog "$p"
done

这将输入将变量写入文件的命令到您的程序中,然后退出shell(因为输入结束)。

最后,您将在文件test.txt 中连接$TEST 的所有值。

【讨论】:

    猜你喜欢
    • 2022-01-03
    • 2013-09-04
    • 2015-09-16
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    • 2017-09-08
    • 2013-02-06
    • 1970-01-01
    相关资源
    最近更新 更多