我想知道为什么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如果在背景上运行时如何在单行上打印。谢谢。
答案 0 :(得分:4)
你看到的是两个输出的组合。第一个输出是shell,打印命令提示符(petr@PetrLinux-VirtualBox:~/Documents$
)。第二个输出是您脚本中的root
。
当您的shell脚本在后台运行时,您现在有两个进程写入终端窗口:bash(打印提示符)和脚本,打印awk-output。然后就这样混淆了。
防止这种情况的唯一方法是将脚本的输出重定向到文件或其他设备,而不是控制台。例如:
$ ./script1 /bin/bash &> output.txt &
答案 1 :(得分:1)
输出相同。它似乎有所不同,因为两个进程在同一个通道(您的终端)上写入并混合它们的输出。一个进程是awk脚本,另一个是shell,它打印一个新提示。
无法确定输出从一个进程切换到另一个进程的精确点。它可以在不同的系统上(使用相同的软件)不同,它也可以取决于计算机的负载和许多其他东西。
唯一合适的解决方案是将输出重定向到不同的流,例如: G。使用> outfile
的文件。