在后台运行时输出awk

时间:2014-12-03 20:42:44

标签: linux bash awk

我想知道为什么awk在后台运行时打印不同的输出

我的剧本:

#!/bin/bash
echo "Name of shell is $SHELL"
relase=`uname -r`
echo "Release is: $relase"
if [ $SHELL != "/bin/bash" ] || [ $relase != "3.13.0-32-generic" ] ; then
  echo "Warning, different configuration"
fi
if [ $# -eq 0 ] ; then
  echo "Insert name of shell"
  read sname
else
   sname=$1
fi
awk -v sname="$sname" 'BEGIN {FS=":"} {if ($7 == sname) print $1 }' </etc/passwd &

当我在没有&符号的情况下运行awk时,输出为:

petr@PetrLinux-VirtualBox:~/Documents$ ./script1 /bin/bash
Name of shell is /bin/bash
Release is: 3.13.0-32-generic
root
petr

但是当我用&符号运行awk时 - 在后台,输出如下:

petr@PetrLinux-VirtualBox:~/Documents$ ./script1 /bin/bash
Name of shell is /bin/bash
Release is: 3.13.0-32-generic
petr@PetrLinux-VirtualBox:~/Documents$ root
petr

第一条记录(根)不会打印在单行上。请告诉我为什么agn如果在背景上运行时如何在单行上打印。谢谢。

2 个答案:

答案 0 :(得分:4)

你看到的是两个输出的组合。第一个输出是shell,打印命令提示符(petr@PetrLinux-VirtualBox:~/Documents$)。第二个输出是您脚本中的root

当您的shell脚本在后台运行时,您现在有两个进程写入终端窗口:bash(打印提示符)和脚本,打印awk-output。然后就这样混淆了。

防止这种情况的唯一方法是将脚本的输出重定向到文件或其他设备,而不是控制台。例如: $ ./script1 /bin/bash &> output.txt &

答案 1 :(得分:1)

输出相同。它似乎有所不同,因为两个进程在同一个通道(您的终端)上写入并混合它们的输出。一个进程是awk脚本,另一个是shell,它打印一个新提示。

无法确定输出从一个进程切换到另一个进程的精确点。它可以在不同的系统上(使用相同的软件)不同,它也可以取决于计算机的负载和许多其他东西。

唯一合适的解决方案是将输出重定向到不同的流,例如: G。使用> outfile的文件。