我想在bash -c
构造中运行别名。
bash
手册说:
当 shell 不是交互式时,别名不会扩展,除非
expand_aliases
shell 选项设置为shopt
在这个例子中,为什么显式hi
设置时找不到别名expand_aliases
?
% bash -O expand_aliases -c "alias hi='echo hello'; alias; shopt expand_aliases; hi"
alias hi='echo hello'
expand_aliases on
bash: hi: command not found
我在跑步GNU bash, version 5.0.0(1)-release (x86_64-pc-linux-gnu)
。
上下文:我希望能够以空闲优先级运行别名,例如包含以下内容的脚本:
#!/bin/bash
exec chrt -i 0 nice -n 19 ionice -c 3 bash -c ". ~/.config/bash/aliases; shopt -s expand_aliases; $(shell-quote "$@")"
我想避免使用bash -i
,因为我不想.bashrc
被阅读。
如果将别名设置在与它使用的同一行上,它似乎不起作用。可能与在实际解析阶段之前的命令行处理早期如何扩展别名有关。在交互式外壳上:
请注意使用的别名是如何晚了一行的:在第二个命令中,它没有找到刚刚设置的别名,而在第三个命令中,它使用了之前设置的别名。
因此,如果我们在
-c
字符串中添加换行符,它会起作用:(您也可以在脚本中使用
bash -O expand_aliases -c ...
而不是使用shopt
,这并不是说它有助于换行。)或者,您可以使用 shell 函数而不是别名,它们在其他方面也更好:
正如 ilkkachu 所建议的,将我的评论变成答案。
Bash 手册(链接到问题中)确实提供了在同一行上有别名定义和命令时如何处理别名的解释。
报价(为了清楚起见,稍微格式化):
ilkkachu 的回答为这个问题提供了多种可能的解决方案。