我已经从以下位置获得了包装脚本“hhighlighter”https://github.com/paoloantinori/hhighlighter在标准输出中为您想要的任何颜色着色。我按照有关安装 ack-grep 的说明进行操作,在 ~/.bashrc 中为 ack=ack-grep 创建了别名,将 h() 函数放入 ~/.bashrc 中,在终端中输入时一切正常。但是当将完全相同的命令放入 bash 脚本中时,它会说找不到命令。我将在这里举例...
root@kali:~# echo "abcd" | h a b c d
abcd
这是我的脚本的样子
#!/bin/bash
echo "abcd" | h a b c d
与输入的命令完全相同,但这是运行脚本时的输出
root@kali:~# ./test.sh
./test.sh: line 1: h: command not found
当直接在终端中输入时,但在 bash 脚本中使用完全相同的命令时,这如何工作?如果需要我的 ~/.bashrc 或需要其他任何东西来解决此问题,请告诉我,它已经持续了 4 天,但没有解决这个问题。
答案1
问题是:当 bash 以非交互方式启动时,它不会读取~/.bashrc
.
因此你必须阅读h()
脚本。
如果你想在脚本中使用别名,那么你必须
允许在脚本中使用别名
shopt -s expand_aliases
在脚本中定义别名。
别名的替代方法是定义 shell 函数(在交互式和非交互式 shell 中工作方式相同):
foo () {
bar "$@"
}
但是,当运行脚本的 shell 重新初始化时,无法将正在运行的 shell 中的别名或函数定义接管到脚本中。
答案2
对我有帮助的解决方案是强制脚本在带有#!/bin/bash -i
标题的交互模式下运行。
高级 Bash 脚本指南警告但关于奇怪的后果:
请注意,这可能会导致不稳定的脚本行为或即使不存在错误也会显示错误消息。
然而我还没有观察到这样的事情。