从标准输出创建别名
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 个词:alias
、someOtherAlias="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
我正在尝试从另一个命令行工具的输出动态创建别名。
例如:
> 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 个词:alias
、someOtherAlias="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