从标准输出创建别名

时间:2018-10-26 06:55:01

标签: bash stdout alias

我正在尝试从另一个命令行工具的输出动态创建别名。

例如:

> MyScript
blender="/opt/apps/blender/blender/2.79/blender"
someOtherAlias="ls -l"

我正在尝试以下代码:

MyScript | {
   while IFS= read -r line;
   do
      `echo alias $line`;
   done;
}

但是当我运行它时,出现以下错误:

bash: alias: -l": not found

仅尝试单独运行此命令会给我同样的错误:

> `echo 'alias someOtherAlias="ls -l"'`
bash: alias: -l": not found

但是显然,以下命令确实有效:

alias someOtherAlias="ls -l"

我试图找到其他以前可能做过的人,但是我的搜索都没有找到任何东西。

我将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

了解bash(和posix shell)命令如何解析和引用,并查看语法和文字参数之间的区别:例如'.."..' "..'.."是参数中的乱七八糟的引号,而"'是shell语法,不是参数的一部分

此外,启用set -x的定价可能有助于了解:

set -x
`echo 'alias someOtherAlias="ls -l"'`
++ echo 'alias someOtherAlias="ls -l"'
+ alias 'someOtherAlias="ls' '-l"'
bash: alias: -l": not found

bash看到3个单词:aliassomeOtherAlias="ls-l"。 并且如果别名包含=,则别名将遍历其参数,它将创建别名,否则将显示别名参数,因为-l"不是别名,它将显示错误。

还请注意,因为反引号意味着命令在子shell中运行(可以在跟踪中使用多个+看到),因此在当前shell中将无效。

eval可用于将文字重新解释为bash语法(或再次解析字符串)。

因此下面的方法应该可行,但是要小心(在用户输入中)对任意参数使用eval可以运行任意命令。

eval 'alias someOtherAlias="ls -l"'

最后,管道之后的bash命令也都在subshel​​l中运行。

while IFS= read -r line;
do
    `echo alias $line`;
done <MyScript