如果使用反引号 (`) 调用,则不会使用本地创建的别名

如果使用反引号 (`) 调用,则不会使用本地创建的别名

我在尝试构建一个脚本来对 10 个不同单词的多个文件执行 grep 操作时遇到了这个问题。

我创建的脚本是(缩小的)

#!bin/bash
alias grep='grep -n'
out=`grep word $1`

输出

some text word  
some other text word more text

grep 确实有效,但不考虑别名。它只输出匹配的行而不是行号(-n用于行号)

现在如果我运行下面的命令,它工作正常

#!bin/bash
out=`grep -n word $1`

上述脚本的输出和预期输出:

233: some text word  
532: some other text word more text

我在脚本的很多地方都有 grep 语句,我不想​​去编辑每一行。我希望通过别名来覆盖 grep 一次,但它似乎不起作用。

这里可能有什么问题?我怎样才能使别名起作用?

答案1

你忘记了这一行:

shopt -s expand_aliases

例如

#!/bin/bash
shopt -s expand_aliases
alias grep='grep -n'
out=$(grep word "$1")
echo "$out"

答案2

问题是您为实际 shell 创建了别名。当您使用反引号(或$(...))时,您运行的子 shell 会忽略您的别名(据我所知,别名无法导出,因此您必须在子 shell 中重新定义它们)。

对于您的情况,也许最好的方法是设置一个包含命令的变量。说:

MY_GREP="grep -n"
out=`${MY_GREP} word $1`

相关内容