我想在循环中创建bash别名,循环从命令中读取行.为了逐行读取输出,我相信我需要将输出管道输入read.但是,当我这样做时,别名不存在.
如果我在我的网站中包含以下内容.bashrc:
for x in a1 a2; do
eval "alias $x='echo foo'"
done
echo -e "a3\na4" | while read x; do
eval "alias $x='echo foo'"
done
Run Code Online (Sandbox Code Playgroud)
别名a1和a2存在,但a3并a4没有.这两个循环有什么区别?
管道中的while循环在子shell中运行.你可以做:
while read x; do
eval "alias $x='echo foo'"
done << EOF
a3
a4
EOF
Run Code Online (Sandbox Code Playgroud)
问题是管道.在表单的管道中a | b | c,每个单独的命令a,b并c在一个单独的子shell [ ref ]中运行,这意味着它接收父进程执行环境的副本(包括别名),以及它对自己的任何更改复制(例如通过运行alias)对父[ ref ] 没有影响.
在您的情况下,您可以通过写:
while read x; do
eval "alias $x='echo foo'"
done < <(echo -e "a3\na4")
Run Code Online (Sandbox Code Playgroud)
它仍将echo -e "a3\na4"在子shell中运行,但将while在正常/父执行环境中运行-loop.