Bash:在变量中使用别名


9

我正在编写一个bash脚本,该脚本将每个参数作为命令运行。这适用于my中的命令PATH,但不适用于别名。我可以直接在脚本中调用别名,但是不能调用已作为参数传递的别名。

问题(我认为)是别名在变量之前扩展。有没有办法从变量运行别名?

示例脚本:

#!/bin/bash
# File: runall

shopt -s expand_aliases
source ~/.aliases

while (( "$#" )); do
    $1
    shift
done

runall "echo test"可行,但runall "myalias"runall: line 8: myalias: command not found

Answers:


9

经过一些测试,我得出以下结论:

  • 别名仅在交互模式下起作用(添加-i到shebang中)。
  • 当别名来自可解释的来源(在这种情况下为变量)时,不评估别名。
  • 您可以使用bash来使用别名eval $1。请注意,eval使用变量创建的任何内容都是危险的,但是由于脚本的整个要点都需要任意执行,因此我不会对此做太多事情。

从bash手册页:

如果外壳不是交互式的,则别名不会扩展,除非使用shopt设置expand_aliases shell选项(请参阅下面的SHELL BUILTIN COMMANDS下的shopt的说明)。

因此,您可以添加shopt -s expand_aliases而不是-i

也,

读取命令时(而不是执行命令时),别名会扩展。

由于变量在读取命令之前不会扩展,因此不会使用别名进一步扩展它们。


1
很高兴知道。出于好奇:为什么eval变量很危险?

1
@hesse考虑eval "echo $1"。说我打电话./script.sh "hello;rm -rf ~。什么被执行?echo hello,其次rm -rf ~。显然,这是一个人为的例子,但是原理仍然成立。
凯文(Kevin)

因为我已经有了,所以eval$1工作之前增加了shopt -s expand_aliases。谢谢!
杰森(Jayson)2012年

1

我遇到了类似的问题,并且设法通过将别名转换为函数来解决了这个问题,如本网站所述,该方法对我有用。

例如

alias lsd="ls -lash"

function lsd() { ls -lash; }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.