从标准输出创建别名

Create alias from stdout

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

例如:

> 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"

我试图找到其他人以前可能做过这件事,但 none 我的搜索结果是什么。

我将不胜感激任何帮助。谢谢!

查看 bash(和 posix shells)命令解析和引用的工作原理,并查看语法和文字参数之间的区别:例如 '.."..' "..'.." 是参数中的文字引号,而 "' 是 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 管道之后的命令也是 运行 in subshell.

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