V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
redr41n
V2EX  ›  程序员

bash builtin 命令

  •  
  •   redr41n · 2023-02-24 23:46:12 +08:00 · 945 次点击
    这是一个创建于 639 天前的主题,其中的信息可能已经有所发展或是发生改变。

    遇到了个自己难以解决的问题:需要替换 bash 脚本 A 中的 echo 命令,达到修改脚本 echo 输出的内容的目的。 尝试编写一个 echo ( bash 脚本)替换了 /bin/echo,但实际过程中发现,脚本 A 执行的 echo 未受影响。经过排查,原来 echo 是 bash 的 builtin 命令,优先级比外部命令高,但使用 enable -n 禁用 echo 后,脚本 A 执行的 echo 仍未受影响;使用 alias 进行别名替换不起作用,原因 alias 在非交互环境中不起作用。现在没有其他思路了。 背景:不能修改脚本 A 的内容,脚本 A 内有一行"source /etc/profile"

    redr41n
        1
    redr41n  
    OP
       2023-02-24 23:47:00 +08:00
    有没有大佬有思路
    seers
        2
    seers  
       2023-02-24 23:49:38 +08:00 via Android
    绝对路径 echo 试试
    Syiize
        3
    Syiize  
       2023-02-24 23:49:55 +08:00 via Android
    不知道你这个修改输出是修改什么,感觉可以通过自定义一个子函数,在子函数内操作并打印。
    ysc3839
        4
    ysc3839  
       2023-02-24 23:56:16 +08:00 via Android
    怀疑是 X-Y Problem https://coolshell.cn/articles/10804.html
    建议说原始需求
    adrianzhang
        5
    adrianzhang  
       2023-02-24 23:58:42 +08:00
    按我的理解,内置命令的优先级是最高的,在 bash 开始工作的时候,已经将相关的命令载入内存。所以只要 bash 启用了,在 bash 里折腾各种东西都是无效的。

    能够解决你问题的方法,我觉得只有自己编译一个 bash 了。
    leonshaw
        6
    leonshaw  
       2023-02-24 23:59:50 +08:00
    \echo
    redr41n
        7
    redr41n  
    OP
       2023-02-25 00:00:55 +08:00
    原始需求就是要 hook 这个脚本的执行,不能修改脚本 A 的内容
    redr41n
        8
    redr41n  
    OP
       2023-02-25 00:01:41 +08:00
    @adrianzhang 有想过重新编译一个 bash ,但是看看有没有更简单的方法
    redr41n
        9
    redr41n  
    OP
       2023-02-25 00:04:24 +08:00
    @ysc3839 提问像 x-y 问题,是因为原始需求不好说哈哈。其实是一个考试系统,他远程检查本地的文件改动,最后通过 echo 返回结果,所以想修改他的 echo 内容,但是检测的脚本是每次重新生成的,所以无法修改脚本。
    redr41n
        10
    redr41n  
    OP
       2023-02-25 00:04:41 +08:00
    @seers 没法修改脚本 A
    ysc3839
        11
    ysc3839  
       2023-02-25 00:22:29 +08:00 via Android
    @redr41n 没法把输出重定向到管道改吗?
    adoyle
        12
    adoyle  
       2023-02-25 00:31:17 +08:00   ❤️ 1
    既然脚本 A 引用了 /etc/profile ,那就在 /etc/profile 加一段代码。

    ```
    if [ -n $0 ] && [ "$(realpath $0)" == "脚本 A 的绝对路径" ]; then
    echo() { command echo "$@" | tee -a log; }
    fi
    ```

    不影响 echo 的原本功能,同时把 echo 收到的字符串打印到 log 文件里。command echo 是使用原本的 echo 命令。

    匹配绝对路径只是一个例子,只是针对脚本 A 执行 if 里的语句。你也可以匹配文件名,自己改改吧。
    redr41n
        13
    redr41n  
    OP
       2023-02-25 00:38:15 +08:00
    @adoyle 感谢大佬提供的新思路,可行。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   925 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 21:19 · PVG 05:19 · LAX 13:19 · JFK 16:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.