gpt4 book ai didi

相当于-x的bash环境变量?

转载 作者:行者123 更新时间:2023-11-29 09:08:40 26 4
gpt4 key购买 nike

我有一堆我正在调试的脚本,都是嵌套的并且非常讨厌。

只是想知道我是否能够设置一些与 bash 的 -x 选项等效的环境变量。这将为我节省大量时间。

我已经寻找答案,但似乎它不存在 - 希望你们聪明的人能够提供建议,或者可能是替代解决方案。

谢谢!

最佳答案

因为您似乎陷入了困境,所以我会建议一些可怕的选择(还有一个听起来很可怕,但还不错的选择)。

第一选择:使用不同的工具。 strace(1)ltrace(1)两者都可以提供一系列惊人的信息——尽管没有人对 shell 变量一无所知,但它们会向您展示脚本如何与系统的其余部分以及程序的一些内部状态进行交互。它可能已经足够好了。 (如果您是 strace(1) 的新手,请尝试 strace -f -o /tmp/foo ./program - 它会跟随 fork(2)vfork(2)clone(2) 调用,因此子进程也会被跟踪和转储。输出到 /tmp/foo .)

第二种选择:全部替换#!/bin/bash#!/bin/bash -x在您的所有脚本中:

find . -type f -print0 | xargs -0 sed -i -e 's/^#!\/bin\/bash$/#!\/bin\/bash -x/'

也许有一个更好的机制来替换所有脚本上的 shebang 行,但这感觉很好。它会错过 system(3) 的所有用途, popen(3)等,在通过脚本调用的 C 程序中,但这可能很好。如果任何脚本依赖于 /bin/bash 的参数,您可能需要加倍努力才能添加 -x适本地。

最后的选择:开始 sash(1) shell 作为根。复制 /bin/bash/bin/real.bash .编写一个简单粗暴的 C 程序,它将添加 -x/bin/real.bash 的命令行参数, 并将其放入 /bin/bash .这将得到一切:每个 system(3) , 每 popen(3) ,每个初始化脚本,所有 cron 作业,所有用户登录,一切。

您可以稍微修改最后一个选择; Linux 内核提供了每个进程的私有(private)命名空间,可以用来创建一个新的 /bin/bash仅对给定进程的子进程可见。这有点复杂...
  • 复制 bash : cp /bin/bash /bin/real.bash
  • 编写您的 C 包装器以添加 -x到命令行参数并调用 /bin/real.bash . (我们称之为 /bin/wrapper.bash。)
  • 制作 /安装 shared : mount --make-shared /
  • 创建一个新的文件系统命名空间:unshare --mount bash
  • 内新bash , 制作 /一个奴隶:mount --make-slave /
  • 内新bash ,绑定(bind)安装您的替换 bash : mount -B /bin/wrapper.bash /bin/bash
  • 内新bash , 启动你的 shell 脚本。它们都将被重定向到您的包装器。进程并非源自新的 bash将继续使用“真实”/bin/bash ,保持不变。

  • 当最后一个 (grand)*child 进程终止时,私有(private)命名空间和有趣的绑定(bind)挂载也会终止。

    所有这些有趣的事情的结果是你所有的 shell 脚本都保持不变,你可以使用你认为最有用的调试工具。如果你的眼睛恰到好处地眯起眼睛,它就不是很碍眼。

    我在我的工作站上执行了许多这些步骤(除了我使用 --make-rshared--make-rslave,并使用 /bin/dir/bin/ls 而不是 /bin/bash 进行测试),并使用 ls -li /bin/dir /bin/ls 检查了 inode 编号从新命名空间内和新命名空间外的 shell,命名空间外的进程继续看到 inode 编号保持不变,但命名空间内的进程看到 dirls共享 inode 编号。

    有关命名空间、私有(private)挂载和绑定(bind)挂载的完整详细信息,我建议阅读 Documentation/filesystems/sharedsubtree.txt 来自内核源代码树的文件, clone(2)手册页, unshare(1)手册页和 mount(8)手册页。

    绑定(bind)安装会在系统重新启动时消失,所以你不能把任何事情搞砸。 :)

    关于相当于-x的bash环境变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7659222/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com