我从我的教授那里收到了这个 Linux 脚本,我试图理解它的作用,并且我想我知道它的大部分作用。然而,有一个部分让我感到困惑。junk
这一行做了什么:
who | while read user junk
它的目的是什么?我试过用谷歌搜索它,但除了引用垃圾字符之外,我似乎在任何地方都找不到它,而且据我所知,这是一个单独的东西。整个脚本是:
#!/bin/bash
#Run a while loop using input of user command
who | while read user junk
do
#Get users real name from /etc/passwd file
realname=`grep $user /etc/passwd | cut -d: -f5`
echo "User: $realname ($user)"
#Get user's logged in time using who command
loggedin=`who | grep $user | awk '{print $3" "$4}'`
echo "Logged in: $loggedin"
#Get home directory of the user from /etc/passwd file
homedir=`cat /etc/passwd | grep $user | cut -d":" -f6`
echo "Home Directory is $homedir"
#Get count of all files in user's home directory
#including sub-directories (excluding directory count) using find command
file_dir_count=`find $homedir -type f | wc -l`
echo "Home directory contains $file_dir_count files"
#Get user's processes count using ps command
proc_count=`ps -u $user --no-headers | wc -l`
echo "$user has $proc_count processes"
#Display user's top 7 memory using process list in given order using top
echo "Top 7 processes sorted by Memory Usage:"
top -b -n 1 -u $user -o %MEM | head -14 | tail -8 | awk '!($3="")'
done
答案1
read
脚本中使用的方式意味着它将读取输出中每行的第一个单词who
到变量中user
,并且该行的其余部分(从第一个空格或制表符)到变量 中junk
。
默认情况下,read
将由(空格、制表符、换行符)中的任何字符分隔的单词读$IFS
入每个列出的变量中。列出的最后一个变量将获得在将单词分配给前面的变量后剩下的数据。
这是一种只读取每行第一个单词的廉价方法。
看 ”理解“IFS=读取-r行”“ 更多细节。
该脚本有一些问题。例如,如果用户的用户名是彼此的子字符串(例如bill
和 ) ,它会给出不正确的结果(并且很可能是错误) billy
。如果用户的文件的文件名包含换行符,它也会产生错误的结果。
它还执行who
再次对于每个用户,即使这些信息很可能已通过初始read
.它还会/etc/passwd
多次读取该初始who
命令的每行输出。
我建议将处理分为信息收集部分(它使用单个getent passwd "$user"
调用来获取passwd
信息,并且它不会不是使用top
主要是交互式监控工具)和单独的报告部分(用于输出)。使用空格(例如空行)也可以提高可读性。