我正在尝试从另一个命令行工具的输出动态创建别名。
例如:
> 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"
我试图找到其他以前可能做过的人,但是我的搜索都没有找到任何东西。
我将不胜感激。谢谢!
答案 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个单词:alias
,someOtherAlias="ls
和-l"
。
并且如果别名包含=
,则别名将遍历其参数,它将创建别名,否则将显示别名参数,因为-l"
不是别名,它将显示错误。
还请注意,因为反引号意味着命令在子shell中运行(可以在跟踪中使用多个+
看到),因此在当前shell中将无效。
eval
可用于将文字重新解释为bash语法(或再次解析字符串)。
因此下面的方法应该可行,但是要小心(在用户输入中)对任意参数使用eval可以运行任意命令。
eval 'alias someOtherAlias="ls -l"'
最后,管道之后的bash命令也都在subshell中运行。
while IFS= read -r line;
do
`echo alias $line`;
done <MyScript