2013-03-06 78 views
0

我想要做的事很简单,但是我不能在没有几个命令的情况下完成它。这是迄今为止的样子。我很乐意能够在一条马虎的线上做到这一点,它只是一次通过所有的命令。将多个bash命令的输出格式化为列

# cat /sys/class/scsi_host/host*/device/fc_host:host*/port_name >port 
# cat /sys/class/scsi_host/host*/device/fc_host:host*/speed >speed 
# cat /sys/class/scsi_host/host*/device/fc_host:host*/port_state >state 
# paste -d ' ' port speed state 
0x218000e01a0002d2 8 Gbit Online 
0x218100e01a2002d2 8 Gbit Online 

我试图用子shell,变量等来做到这一点。格式结束了错位,或更糟。

# echo "$port_name" "$speed" "$state" 
0x218000e01a0002d2 
0x218100e01a2002d2 8 Gbit 
8 Gbit Online 
Online 

# paste -d ' ' "$(cat /sys/class/scsi_host/host*/device/fc_host:host*/port_name)" "$(cat /sys/class/scsi_host/host*/device/fc_host:host*/speed)" 
paste: 0x218000e01a0002d2 
0x218100e01a2002d2: No such file or directory 

回答

2

相反的命令替换,尝试进程替换:

paste -d ' ' <(cat /sys/class/scsi_host/host*/device/fc_host:host*/port_name) \ 
      <(cat /sys/class/scsi_host/host*/device/fc_host:host*/speed) \ 
      <(cat /sys/class/scsi_host/host*/device/fc_host:host*/port_state) 
+0

你达人!谢谢! – 2013-03-06 15:50:54

+0

我已经阅读过有关tee的过程替换,但这让我感到困惑。这将其放入更简单的上下文中。 – 2013-03-06 16:07:57

-1

这个是什么?

for i in /sys/class/fc_host/host*; do (cd $i; echo -e "$(cat port_name)\t$(cat port_state)\t$(cat speed)"); done