Bash shopt在shell函数内部不工作

Bash shopt在shell函数内部不工作,bash,shell,ubuntu,shopt,Bash,Shell,Ubuntu,Shopt,我在Ubuntu上工作,并使用BashShell 我正在尝试执行如下所示的“别名”,但它不起作用 do_build() { source env.sh shopt -s expand_aliases hal-on } # Main do_build 当我尝试'shopt-s扩展的_别名;来源env.sh;hal在“函数外部工作,但函数内部不工作” do_build() { source env.sh shopt -s expand_aliases hal-on } # Main d

我在Ubuntu上工作,并使用BashShell

我正在尝试执行如下所示的“别名”,但它不起作用

do_build()
{
source env.sh

shopt -s expand_aliases

hal-on
}

# Main
do_build
当我尝试'shopt-s扩展的_别名;来源env.sh;hal在“函数外部工作,但函数内部不工作”

do_build()
{
source env.sh

shopt -s expand_aliases

hal-on
}

# Main
do_build
错误消息

  • 哈尔安 /温度:第10行:hal on:未找到命令

我做错了什么?

别名在bash中有奇怪的行为,使用函数几乎总是更好的。在您的示例中,很可能是函数中别名的定义,我不确定那里会发生什么

此外,在函数中生成源文件是不常见的,也是有问题的,除非它只是一组变量集。事实上,除非您显式地将变量声明为“本地”,否则在外部执行源代码没有什么区别

我能看到的一种情况是,您可能只在特定条件下执行环境中定义的操作。如果你的变量集很复杂,我可以看出你不想这么做。但实际上,将其限制为变量集。。。没有函数/别名定义

阅读bash手册页中的别名。搜索“别名未展开”。它与“在读取时扩展别名”有关。通过一些实验,即使shopt设置在函数定义之前,别名似乎也不会在函数中展开

所以。。。改用函数


alias foo=“bar baz”
变为
foo(){bar baz“$@”}
,通常操作相同。

别名在bash中有奇怪的行为,使用函数几乎总是更好的。在您的示例中,很可能是函数中别名的定义,我不确定那里会发生什么

此外,在函数中生成源文件是不常见的,也是有问题的,除非它只是一组变量集。事实上,除非您显式地将变量声明为“本地”,否则在外部执行源代码没有什么区别

我能看到的一种情况是,您可能只在特定条件下执行环境中定义的操作。如果你的变量集很复杂,我可以看出你不想这么做。但实际上,将其限制为变量集。。。没有函数/别名定义

阅读bash手册页中的别名。搜索“别名未展开”。它与“在读取时扩展别名”有关。通过一些实验,即使shopt设置在函数定义之前,别名似乎也不会在函数中展开

所以。。。改用函数


alias foo=“bar baz”
变成
foo(){bar baz“$@”}
并且通常以相同的方式运行。

可能的@IporSircer副本看起来不像是明显的副本——事实上它要求的是相反的--,虽然我认为公认的答案可能也是一个合适的解决方法,但首先使用别名显然是你可以做的不同的事情。我不太愿意直截了当地说它是“错的”,但如果可以的话,还有很多很多其他的理由可以避免使用别名。可能的@IporSircer的重复看起来不像是明显的重复——事实上,它要求的恰恰相反——,虽然我认为公认的答案可能也是一个合适的解决方法,但首先使用别名显然是你可以做的不同的事情。我不太愿意直截了当地说它是“错的”,但如果可以的话,还有很多很多其他的理由可以避免使用别名。