bash builtin 命令

2023-02-24 23:46:12 +08:00
 redr41n

遇到了个自己难以解决的问题:需要替换 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"

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

能够解决你问题的方法,我觉得只有自己编译一个 bash 了。
leonshaw
2023-02-24 23:59:50 +08:00
\echo
redr41n
2023-02-25 00:00:55 +08:00
原始需求就是要 hook 这个脚本的执行,不能修改脚本 A 的内容
redr41n
2023-02-25 00:01:41 +08:00
@adrianzhang 有想过重新编译一个 bash ,但是看看有没有更简单的方法
redr41n
2023-02-25 00:04:24 +08:00
@ysc3839 提问像 x-y 问题,是因为原始需求不好说哈哈。其实是一个考试系统,他远程检查本地的文件改动,最后通过 echo 返回结果,所以想修改他的 echo 内容,但是检测的脚本是每次重新生成的,所以无法修改脚本。
redr41n
2023-02-25 00:04:41 +08:00
@seers 没法修改脚本 A
ysc3839
2023-02-25 00:22:29 +08:00
@redr41n 没法把输出重定向到管道改吗?
adoyle
2023-02-25 00:31:17 +08:00
既然脚本 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
2023-02-25 00:38:15 +08:00
@adoyle 感谢大佬提供的新思路,可行。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/919034

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX