为什么我不能在while循环中进行评估?

Jef*_*kas 6 bash shell

我想在循环中创建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)

别名a1a2存在,但a3a4没有.这两个循环有什么区别?

Wil*_*ell 6

管道中的while循环在子shell中运行.你可以做:

while read x; do
    eval "alias $x='echo foo'"
done << EOF
a3
a4 
EOF
Run Code Online (Sandbox Code Playgroud)


rua*_*akh 5

问题是管道.在表单的管道中a | b | c,每个单独的命令a,bc在一个单独的子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.