【问题标题】:process substitution not working in ksh on AIX进程替换在 AIX 上的 ksh 中不起作用
【发布时间】:2014-09-01 16:15:50
【问题描述】:

以下循环在 Linux 和 Solaris 上的 bash 中完美运行,但在默认为 ksh 的 AIX 上失败:

while read -r line; do
    var1=$(...)
    var2=$(...)
    echo "$var1  $var2"
done < <(lsvgfs `lsvg | grep -v rootvg`)

带有以下信息:

0403-057 第 11 行的语法错误:不应出现 `

【问题讨论】:

  • &lt; &lt;(lsvgfs `lsvg | grep -v rootvg`) 是进程替换,是 BASH 特定的,在 ksh 中不支持。
  • 我认为更有可能是现代的&lt;() 结构不起作用,而不是重定向。嗯,我认为它是现代的,但我不能说它是什么时候添加的。 (参见this:“进程替换仅在支持 /dev/fd/N 特殊文件的 Unix 系统上可用,以便对已打开的文件描述符进行命名访问。”
  • 请始终包含您的ksh 版本(我猜您正在运行ksh88),因为这在ksh93 中工作得很好。

标签: ksh


【解决方案1】:

你可以试试这个:

lsvgfs `lsvg | grep -v rootvg` | while read -r line; do
           var1=$(...)
           var2=$(...)
           echo "$var1  $var2"
done

【讨论】:

  • 只要在循环结束后不需要var1var2,这将起作用。
  • @Etan Reisner:是的,这是一个缺点,因为每个管道成员都在自己的 shell 中执行。
  • 正确。只是想确保它被指出。临时文件是允许主 shell 变量可见性的另一种选择(我实际上知道的唯一另一种选择)。
  • 我不会把它称为only的其他选择;人们总是可以使用命名管道。
  • 在 ksh 中你仍然有循环之后的变量。
猜你喜欢
  • 2019-01-27
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 2014-09-24
  • 1970-01-01
  • 1970-01-01
  • 2012-08-25
相关资源
最近更新 更多