愿上帝永远不会让你在Solaris上工作的祸根。 现在,我正在尝试运行这个简单的shell脚本:
#!/bin/sh
input="a
b
c"
data="123"
while read eachline
do
data="$data$eachline"
done << EOF
$(echo "$input")
EOF
echo "$data"
exit 0
在RHEL(BASH)上我按预期接收输出,即“123abc”,但是,在Solaris上我只收到“123”。
经过一段时间的谷歌搜索,我意识到Solaris正在为while循环中的代码分配进程,因此变量的($ data)值不会反映在while循环的外部。
任何希望在两个平台上兼容此代码的人都将非常感激。
哦,是的,使用临时文件进行重定向不是一个非常优雅的解决方案:|
答案 0 :(得分:2)
Solaris盒子上有bash可执行文件吗?我注意到你指的是RHEL上的bash,但你的shell设置为#!/ bin / sh(即vanilla Bourne shell)。
答案 1 :(得分:0)
您的脚本在Mac OS X 10.5上运行正常,该版本已通过Single Unix Specification version 3认证。
Solaris上/ bin / sh中while的行为非常奇怪。您能提供找到分叉问题的链接吗?
可能的解决方案可能是使用另一个shell,例如/ bin / ksh。
修改强>
您的链接提供的示例不会显示while
的问题,而是任何shell的正常行为。所有这些的基本结构是:
first_command | second_command_updating_variable
second_command_updating_variable
是while
循环的事实并不重要。重要的是管道的第二个命令在子shell中执行,不能修改其父shell的变量。
答案 2 :(得分:0)
这个怎么样(请注意反推):
#!/bin/sh
input="a
b
c"
data="123"
z=`while read eachline
do
data="$data$eachline"
done << EOF
$(echo "$input")
EOF
echo $data
`
echo $z
exit 0
答案 3 :(得分:0)
下面这段代码解决了我的问题。我想这里的关键是在子shell和ofcourse中回显变量,而不是使用“here”文档。
我已经在CSH / BASH / KSH上测试了这段代码。
#!/bin/sh
input="a
b
c"
printf "$input" | {
data="123"
while read eachline
do
data="$data$eachline"
done
echo "$data"
}
exit 0
衷心感谢参与讨论的所有人。
答案 4 :(得分:0)
为什么在这里的文件中执行subshell?
while read eachline
do
data="$data$eachline"
done << EOF
$(echo "$input")
EOF
你可以插入:
while read eachline
do
data="$data$eachline"
done << EOF
$input
EOF
或回声:
echo "$input" | while read eachline
do
data="$data$eachline"
done
实际上,当我测试这些时,他们都在Solaris上工作对我来说很好,所以我不确定你为什么遇到麻烦。