Tia*_*nta 5 shell dash alias shell-script function
请参阅下面的代码:
a()(alias x=echo\ hi;type x;alias;x);a
Run Code Online (Sandbox Code Playgroud)
我在函数中有一个别名,我不想更改外部环境(这就是为什么我使用()而不是{}),即使代码说别名已成功设置,它也不起作用,请检查输出:
x is aliased to `echo hi'
...
alias x='echo hi'
x: command not found
Run Code Online (Sandbox Code Playgroud)
我听说这样做shopt -s expand_aliases可以解决,但不只是它没有任何效果,以及我不能依靠bash,因为我有工作dd-wrt的busybox的ash。
有人知道这个问题吗?
我不使用dash,但这是bash手册对别名的说明:
有关别名的定义和使用的规则有些令人困惑。 在执行该行上的任何命令之前,Bash 总是至少读取一个完整的输入行。别名在读取命令时展开,而不是在执行时展开。因此,与另一个命令出现在同一行上的别名定义在读取下一行输入之前不会生效。 该行别名定义之后的命令不受新别名的影响. 执行函数时,此行为也是一个问题。别名在读取函数定义时展开,而不是在执行函数时展开,因为函数定义本身就是一个复合命令。因此,函数中定义的别名在执行该函数之前不可用。为安全起见,始终将别名定义放在单独的行上,并且不要在复合命令中使用别名。
另一个引用,这次来自zsh手册:
以下代码说明了别名的常见问题:
Run Code Online (Sandbox Code Playgroud)alias echobar='echo bar'; echobar这会打印一条消息,指出
echobar找不到该命令。发生这种情况是因为在读入代码时会扩展别名;整行是一次性读取的,因此在echobar执行时扩展新定义的别名为时已晚。 这通常是使用source或执行的 shell 脚本、函数和代码中的问题.。因此,建议在非交互式代码中使用函数而不是别名。
我很确定它在其他 shell 中也是相似的。
如果您不反对使用eval:
$ busybox ash -c 'a()(alias x=echo\ hi;type x;alias;eval x);a'
x is an alias for echo hi
x='echo hi'
hi
Run Code Online (Sandbox Code Playgroud)
我不知道为什么这有效。
| 归档时间: |
|
| 查看次数: |
2061 次 |
| 最近记录: |